You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何实现具有类似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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.23 13:36:15