如何实现具有类似Promise.all映射返回类型的Promise.any?
自定义Promise.any变体的类型问题
Promise.all会解析为与传入的Promise数组对应的结果数组。以下是ES2015库中Promise.all的声明:
all<T extends readonly unknown[] | []>(values: T): Promise<{ -readonly [P in keyof T]: Awaited<T[P]> | undefined }>;
返回值的映射类型非常实用。我想要编写一个具有类似返回类型的Promise.any变体,目前的实现如下:
export async function any<T extends readonly unknown[]>( proms: T, ): Promise<{ -readonly [P in keyof T]: Awaited<T[P]> }> { return new Promise((res, rej) => { for (let i = 0; i < proms.length; i++) { // @ts-ignore: type unknown doesn't have .then proms[i].then( // @ts-ignore: subresult is type any (subresult) => { const all_results = new Array(proms.length); all_results[i] = subresult; // @ts-ignore: all_results does not match the return type res(all_results); }, rej, ); } }); }
目前遇到两个问题:
- 当把泛型
T改为extends readonly Promise<unknown>[]时,映射类型失效。比如下面的示例中,[first, second]不再被类型化为[string, number],而是变成[string | number, string | number],完全失去了映射类型的意义:
async function test() { let [ first, second ] = await any([ Promise.resolve('abc'), Promise.resolve(1000) ]) }
- 找不到数组上能暴露映射类型的接口,无法满足TypeScript期望的返回类型。
内容的提问来源于stack exchange,提问作者squinlan
相关产品推荐
相关产品推荐

