问询:实现保留泛型特性的EnhancedReturnType泛型类型
EnhancedReturnType 实现方案
核心实现代码
type EnhancedReturnType<F> = // 处理带单个泛型参数的函数 F extends <T>(...args: infer _) => infer Ret ? Ret extends (...args: any[]) => any // 保留原泛型参数,返回对应函数类型 ? <T>(...args: Parameters<Ret>) => ReturnType<Ret> : Ret : // 处理非泛型函数 ReturnType<F>; // 扩展支持多泛型参数版本(可选) type EnhancedReturnTypeMulti<F> = F extends <T, U>(...args: infer _) => infer Ret ? Ret extends (...args: any[]) => any ? <T, U>(...args: Parameters<Ret>) => ReturnType<Ret> : Ret : F extends <T>(...args: infer _) => infer Ret ? Ret extends (...args: any[]) => any ? <T>(...args: Parameters<Ret>) => ReturnType<Ret> : Ret : ReturnType<F>;
示例验证
泛型函数返回泛型函数
type Case1 = EnhancedReturnType<<T>(g: (a:T, b:T) => T) => ((a: T) => T)>; // 结果:<T>(a: T) => T ✅泛型函数返回非函数类型
type Case2 = EnhancedReturnType<<T>(g: (a:T, b:T) => T) => number>; // 结果:number ✅非泛型函数返回函数
type Case3 = EnhancedReturnType<(g: (a: number, b: string) => number) => ((a: string) => boolean)>; // 结果:(a: string) => boolean ✅泛型函数返回不依赖泛型的函数
type Case4 = EnhancedReturnType<<T>(g: (a:T, b:T) => T) => ((a: number) => string)>; // 结果:<T>(a: number) => string(与 (a: number) => string 等价)✅
实现逻辑说明
- 先判断输入类型
F是否为带泛型参数的函数:- 若是,检查其返回值是否为函数类型:
- 返回值为函数时,通过显式保留原泛型参数,避免原生
ReturnType默认的类型退化(从泛型退化为unknown) - 返回值非函数时,直接返回该类型
- 返回值为函数时,通过显式保留原泛型参数,避免原生
- 若
F不是泛型函数,直接使用原生ReturnType<F>获取结果
- 若是,检查其返回值是否为函数类型:
应用场景适配
针对依赖注入场景,该类型可以正确捕获带依赖的泛型函数的返回类型:当工具填充依赖(如示例中的g)后,返回的函数会保留原泛型参数约束,确保类型安全,避免出现unknown这类无意义的推断结果。
内容的提问来源于stack exchange,提问作者Glen Whitney
相关产品推荐
相关产品推荐

