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

TypeScript中如何获取Promise包裹对象的内部data属性类型

解决TypeScript提取Promise返回值中data字段类型的问题

你的问题核心在于:sample是Promise<{ data: somethingElse }>类型,而Pick只能操作对象类型的键,但Promise本身并没有data这个属性,所以直接用Pick会报错。要提取data的类型,得先拿到Promise内部包裹的对象类型,再访问其data属性。

解决方案1:使用TypeScript内置的Awaited类型(TS 4.5+)

Awaited是TS官方提供的工具类型,专门用来提取Promise的resolve值类型,直接用它就能拿到Promise包裹的对象:

// 先获取方法的返回类型(Promise<{data: ...}>)
type sample = ReturnType<FintechService['getMockSummaryData']>;
// 提取Promise内部的对象类型
type ResolvedData = Awaited<sample>;
// 取出data字段的类型
type DataType = ResolvedData['data'];

// 也可以直接简写为一行
type DataType = Awaited<ReturnType<FintechService['getMockSummaryData']>>['data'];

解决方案2:兼容旧版TypeScript(低于4.5)

如果你的TS版本低于4.5,没有Awaited,可以自己实现一个工具类型来提取Promise的泛型参数:

// 自定义工具类型:提取Promise包裹的类型
type UnwrapPromise<T> = T extends Promise<infer U> ? U : T;

// 提取data类型
type DataType = UnwrapPromise<ReturnType<FintechService['getMockSummaryData']>>['data'];

为什么之前的方法无效?

Pick<sample, 'data'>报错是因为sample是Promise类型,keyof Promise<any>只能拿到Promise自身的属性(比如then、catch这些方法),根本没有data这个键,所以TypeScript会提示约束不满足。必须先解开Promise的包裹,拿到内部的对象类型后,才能访问data属性。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.28 23:15:17