Typescript联合类型数组作为数组函数参数,例如在$ q.all

时间:2016-06-16 08:19:45

标签: angularjs typescript

考虑一个声明为(从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(/*...*/);

1 个答案:

答案 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];
}