You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

问询:实现保留泛型特性的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>;

示例验证

  1. 泛型函数返回泛型函数

    type Case1 = EnhancedReturnType<<T>(g: (a:T, b:T) => T) => ((a: T) => T)>;
    // 结果:<T>(a: T) => T ✅
    
  2. 泛型函数返回非函数类型

    type Case2 = EnhancedReturnType<<T>(g: (a:T, b:T) => T) => number>;
    // 结果:number ✅
    
  3. 非泛型函数返回函数

    type Case3 = EnhancedReturnType<(g: (a: number, b: string) => number) => ((a: string) => boolean)>;
    // 结果:(a: string) => boolean ✅
    
  4. 泛型函数返回不依赖泛型的函数

    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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.08 01:48:26