Promise.all的类型定义与文档不匹配

时间:2019-02-11 19:04:44

标签: javascript typescript ecmascript-6 promise es6-promise

看着the type definition of Promise.all,我看到10个定义:

/**
 * Creates a Promise that is resolved with an array of results when all of the provided Promises
 * resolve, or rejected when any Promise is rejected.
 * @param values An array of Promises.
 * @returns A new Promise.
 */
all<T1, T2, T3>(values: [T1 | PromiseLike<T1>, T2 | PromiseLike<T2>, T3 | PromiseLike<T3>]): Promise<[T1, T2, T3]>;

我只包含了一个长度为3的数组,但是还存在all<T1>all<T1, T2>,一直到all<T1, T2, ..., T9, T10>

但是,这与Promise.all的实现不匹配,该实现可以将长度大于10的数组作为输入:

let myPromise = num => Promise.resolve(num);
let myPromisesArray = (new Array(20))
  .fill()
  .map((_,i) => myPromise(i));
Promise.all(myPromisesArray).then(console.log)

我不是世界上最糟糕的开发人员,但我仍然假设,产生ES2015类型定义的Microsoft开发人员比我更了解JS / TS,这引出了一个问题:

  

为什么Promise.all的类型定义与its documentation及其实现都不匹配?

1 个答案:

答案 0 :(得分:4)

最多有10种类型的泛型声明仅考虑不均匀的“元组”,即不同索引具有显式独立类型的数组。

还有a declaration that supports a uniformly typed array的长度不受限制:

all<T>(values: (T | PromiseLike<T>)[]): Promise<T[]>;

使用长度最大为10的元组的声明应涵盖合理数量的用例,并且由于TypeScript作为一种语言的局限性而来,因为元组的泛型类型推断是一个包含union type,将使用上面的签名。这种类型的泛型声明,直到非均匀类型的任意界限,在其他语言(例如C#)中也很常见。例如,Action<>Func<>使用16种参数类型的限制。