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



查看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 的类型定义与其文档和实现都不匹配?

最多 10 种类型的泛型声明仅考虑非统一的"元组",或不同索引具有显式独立类型的数组。

还有一个声明支持无限长度的统一类型数组:

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

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

最新更新