考虑一种被声明为(从angularjs iqservice简化的方法):
all<T1, T2>(values: [IPromise<T1>, IPromise<T2>]): IPromise<[T1, T2]>;
需要一个数组,其中第一项是IPromise<T1>
,而第二个项目A 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(/*...*/);
您可以使用此语法明确告诉编译器"默认"类型:
let promises = [a(), b()] as [IPromise<number>, IPromise<boolean>];
或者您可以创建一个辅助功能,该功能将为您"包裹"它,因此您不必明确定义类型:
function toArray<T1, T2>(a: T1, b: T2) {
return [a, b] as [T1, T2];
}