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
相关产品推荐
相关产品推荐

