[英]Typescript union type arrays as array function parameters, e.g. in $q.all
考虑一个声明为的方法(从AngularJS IQService简化):
all<T1, T2>(values: [IPromise<T1>, IPromise<T2>]): IPromise<[T1, T2]>;
它需要一个数组,其中第一项是IPromise<T1>
,第二项是IPromise<T2>
。 使用此声明时,我有些惊讶,无法使用这种方法:
var promises = [a(), b()];
$q.all(promises).then(/*...*/);
> TS2329 Index signature is missing in type '(IPromise<A> | IPromise<B>)[]'
虽然可以正常工作:
$q.all([a(), b()]).then(/*...*/);
我了解var p = [a(), b()];
将p创建为(A|B)[]
。 我的问题是,在这种情况下,使(A|B)[]
与[A, B]
兼容的最佳方法是什么? 因此,如何在不显式引用a()
和b()
类型的情况下解决此问题,而又不会在$q.all
的返回值中$q.all
类型信息。
var promises: [???] = [a(), b()];
$q.all(promises).then(/*...*/);
您可以使用以下语法告诉编译器显式覆盖推断的“默认”类型:
let promises = [a(), b()] as [IPromise<number>, IPromise<boolean>];
或者您可以创建一个辅助函数,该函数将为您“包装”该函数,这样您就不必显式定义类型:
function toArray<T1, T2>(a: T1, b: T2) {
return [a, b] as [T1, T2];
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.