如何将TypeScript对象类型映射为Promise解析值类型?
解决方案:提取Promise解析值的映射类型
当然可以实现这个需求!TypeScript的类型系统正好有对应的工具,能帮你把对象里每个方法返回的Promise类型,转换成它们的解析值类型。
步骤1:定义通用映射类型
我们可以创建一个通用的类型工具,它会遍历对象的所有键,提取每个方法返回Promise的解析值:
export type UnwrapPromiseValues<T> = { [K in keyof T]: Awaited<ReturnType<T[K]>>; };
让我们拆解一下这个类型的作用:
[K in keyof T]:遍历传入类型T的所有属性键ReturnType<T[K]>:获取每个属性(也就是你的方法a()/b()/c())的返回类型,也就是Promise<X>、Promise<Y>这类Awaited<...>:TypeScript内置的工具类型,专门用来提取Promise的解析值,把Promise<X>转换成X
步骤2:应用到你的对象上
接下来只需要把这个工具类型用到你的对象v上,通过typeof v获取它的类型:
export const v = { a(): Promise<X> { /* ... */ }, b(): Promise<Y> { /* ... */ }, c(): Promise<Z> { /* ... */ } }; export type V = UnwrapPromiseValues<typeof v>;
现在V的类型就完全符合你的需求:{ a: X, b: Y, c: Z }
兼容旧版TypeScript(4.5之前)
如果你使用的是TypeScript 4.5之前的版本(还没有内置Awaited),可以自己实现一个简单的解析工具:
// 自定义Promise解析类型 type Unwrap<T> = T extends Promise<infer U> ? U : T; export type UnwrapPromiseValues<T> = { [K in keyof T]: Unwrap<ReturnType<T[K]>>; };
这个自定义的Unwrap类型通过条件类型推断,同样能把Promise<U>转换成U。
内容的提问来源于stack exchange,提问作者user7898461
相关产品推荐
相关产品推荐

