繁体   English   中英

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

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM