考虑一个声明为(从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
var promises: [???] = [a(), b()];
$q.all(promises).then(/*...*/);
答案 0 :(得分:1)
您可以告诉编译器明确覆盖&#34;默认&#34;使用以下语法进行类型推断:
let promises = [a(), b()] as [IPromise<number>, IPromise<boolean>];
或者你可以创建一个帮助函数,它将包裹&#34;包装&#34;它适合您,因此您不必明确定义类型:
function toArray<T1, T2>(a: T1, b: T2) {
return [a, b] as [T1, T2];
}