查看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 个参数类型。