TypeScript类型映射:如何包装函数返回值并保留参数与泛型?
解决TypeScript映射类型保留函数参数与泛型的问题
没问题,我来帮你搞定这个TypeScript映射类型的需求!你需要的Asyncd类型要能完美保留原函数的参数类型和泛型,同时把返回值包装成Promise,下面是修正后的实现:
完整实现代码
type Asyncd<T> = { [K in keyof T]: T[K] extends <G>(...args: infer P) => infer R ? <G>(...args: P) => Promise<Awaited<R>> : T[K] extends (...args: infer P) => infer R ? (...args: P) => Promise<Awaited<R>> : T[K]; };
测试验证
用你提供的Store接口测试:
interface Store { test1(): void; test2(a: string, b: number): RegExp; test3<T>(a: string, b: number): Promise<T>; } type AsyncStore = Asyncd<Store>;
生成的AsyncStore类型完全符合你的期望:
{ test1(): Promise<void>; test2(a: string, b: number): Promise<RegExp>; test3<T>(a: string, b: number): Promise<T>; }
为什么这个实现能解决问题?
咱们拆解一下关键部分:
- 保留参数类型:通过
infer P捕获原函数的参数列表类型,彻底避免了用any[]导致的参数丢失问题。 - 保留泛型参数:专门处理了带泛型的函数,用
infer G捕获原函数的泛型参数,在重构函数时直接复用这个泛型,确保test3<T>的泛型能被完整保留。 - 正确包装返回值:使用
Awaited<R>处理原返回值可能已经是Promise的情况(比如test3的返回值是Promise<T>),避免出现嵌套的Promise<Promise<T>>,最终得到干净的Promise<T>。
内容的提问来源于stack exchange,提问作者ChaseMoskal
相关产品推荐
相关产品推荐

