如何在TypeScript中转换类所有函数返回类型并保留泛型?
可行,用TypeScript工具类型实现返回类型转换
你可以通过映射类型结合条件类型实现这个需求,自动将类中所有函数的返回类型从CustomPromise<T>转换为Promise<T>,同时完整保留原函数的参数定义和泛型特性。
具体实现代码
class CustomPromise<T> extends Promise<T> { customData: string; } interface RespSomething { data: string; } interface RespWhatever { data: number; } class MyService { something(req: { x: string; y: string }): CustomPromise<RespSomething> { return new CustomPromise<RespSomething>((res, req) => {}); } whatever(req: { a: string }): CustomPromise<RespWhatever> { return new CustomPromise<RespWhatever>((res, req) => {}); } } // 定义通用类型转换工具 type TransformServiceReturn<T> = { [K in keyof T]: T[K] extends (...args: infer Args) => CustomPromise<infer U> ? (...args: Args) => Promise<U> : T[K]; }; // 生成目标类型 type TransformedMyService = TransformServiceReturn<MyService>;
类型工具说明
[K in keyof T]:遍历原类型MyService的所有属性(即类中的方法)T[K] extends (...args: infer Args) => CustomPromise<infer U>:判断当前属性是否是返回CustomPromise的函数,通过infer关键字自动提取函数的参数列表Args和CustomPromise的泛型参数U- 匹配成功时,返回参数列表完全一致但返回类型为
Promise<U>的函数;匹配失败时保留原属性类型
验证示例
你可以通过以下代码验证转换后的类型是否符合预期:
const transformedService: TransformedMyService = { something: (req) => Promise.resolve({ data: "hello" }), whatever: (req) => Promise.resolve({ data: 456 }) };
内容的提问来源于stack exchange,提问作者kitta
相关产品推荐
相关产品推荐

