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

为自定义LazyPromise.all方法实现正确的类型推断

解决LazyPromise.all的类型推断问题

要让LazyPromise.all能正确推断出元组类型(比如[number, string])而非any[],需要利用TypeScript的泛型+映射类型实现精准的类型推导,具体改造如下:

改造后的代码实现

class LazyPromise {
  static all<T extends readonly (() => Promise<any>)[]>(
    lazies: T
  ): Promise<{ [K in keyof T]: Awaited<ReturnType<T[K]>> }> {
    // 执行所有懒加载Promise,通过类型断言告知TS实际返回的是对应元组类型的Promise
    return Promise.all(lazies.map(lazy => lazy())) as Promise<{ [K in keyof T]: Awaited<ReturnType<T[K]>> }>;
  }
}

关键逻辑说明

  1. 泛型约束T:将T约束为只读的「返回Promise的函数元组」,确保TypeScript把传入的字面量数组推断为元组而非普通数组,保留每个元素的位置类型信息。
  2. 映射类型提取结果类型:通过{ [K in keyof T]: Awaited<ReturnType<T[K]>> }遍历元组索引:
    • ReturnType<T[K]>:获取每个函数返回的Promise<U>类型;
    • Awaited<...>:提取Promise内部的resolve值类型U;
    • 最终生成与输入元组位置一一对应的结果元组类型。
  3. 类型断言:由于Array.map默认返回普通数组类型,需要用as断言告诉编译器实际返回的是对应元组类型的Promise。

测试验证

const result = LazyPromise.all([
  () => Promise.resolve(1),
  () => Promise.resolve('foo')
]).then(result => {
  // 此时result的类型会被正确推断为 [number, string]
  console.log(result); // 输出 [1, "foo"]
});

如果传入更多不同类型的懒加载Promise,类型推断依然精准:

LazyPromise.all([
  () => Promise.resolve(123),
  () => Promise.resolve('hello'),
  () => Promise.resolve(true)
]).then(res => {
  // res 类型为 [number, string, boolean]
});

内容的提问来源于stack exchange,提问作者ar099968

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.26 04:35:05