如何获取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
相关产品推荐
相关产品推荐

