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

如何获取TypeScript异步方法的Promise解析值类型?

提取异步方法返回的Promise解析值类型

嘿,这个问题我之前也碰到过!当你用ReturnType<Foo['asyncBar']>拿到的是Promise<{one:number, two:number}>时,要提取里面的实际解析值类型,有两种实用的方案:

方案1:使用TypeScript 4.5+内置的Awaited工具类型

这是最简洁的方式,TypeScript在4.5版本引入了Awaited工具类型,专门用来解析Promise的最终值类型,甚至支持嵌套Promise的解析。示例代码如下:

class Foo{ 
  async asyncBar() { 
    return new Promise((resolve) => resolve({ one: 1, two: 2 }));
  } 
}

// 先拿到异步方法的返回类型(Promise包裹的类型)
type AsyncBarPromiseType = ReturnType<Foo['asyncBar']>;
// 用Awaited解析出Promise内部的类型
type UnwrappedType = Awaited<AsyncBarPromiseType>; // 类型为 {one:number, two:number}

// 也可以直接链式调用,更简洁
type DirectUnwrappedType = Awaited<ReturnType<Foo['asyncBar']>>;

Awaited的优势在于它还能处理复杂的嵌套场景,比如如果你的异步方法返回Promise<Promise<number>>,Awaited会直接解析到最内层的number类型,非常省心。

方案2:自定义条件类型(兼容低版本TypeScript)

如果你的项目使用的TypeScript版本低于4.5,那可以自己写一个简单的工具类型来实现这个功能,核心是用条件类型和infer关键字来推断Promise内部的类型:

// 自定义工具类型:提取Promise的解析值类型
type UnwrapPromise<T> = T extends Promise<infer U> 
  ? U // 如果T是Promise类型,返回其内部的U类型
  : T; // 否则返回原类型

class Foo{ 
  async asyncBar() { 
    return new Promise((resolve) => resolve({ one: 1, two: 2 }));
  } 
}

type AsyncBarPromiseType = ReturnType<Foo['asyncBar']>;
type UnwrappedType = UnwrapPromise<AsyncBarPromiseType>; // 类型为 {one:number, two:number}

这里的infer U是让TypeScript自动推断出Promise的类型参数,然后通过条件判断返回这个推断出的类型,就完成了解包操作。

总结

  • 如果你的TS版本≥4.5,优先用内置的Awaited,它是官方推荐的方案,处理场景更全面;
  • 低版本TS可以用自定义的UnwrapPromise工具类型,逻辑简单易懂,完全能满足需求。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.11 08:28:12