Typescript Union类型数组作为数组函数参数,例如在$ q.ll



考虑一种被声明为(从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];
}

最新更新