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

如何从TypeScript函数类型中推断默认泛型参数使代码正常编译

TypeScript提取函数默认类型参数实现编译通过方案

问题根因

如下代码编译失败的核心原因是:TypeScript内置的ReturnType工具类型处理泛型函数时,不会自动填充泛型参数的默认值。对于<T = string>() => T这个函数类型,未手动指定泛型时T会被推导为unknown,最终ReturnType拿到的返回值类型是unknown,无法赋值给string类型的变量。

const fails: string = "" as ReturnType<<T = string>() => T>;

可行实现方案

  • 方案1:手动为泛型函数传入匹配默认值的类型参数,触发类型匹配
    直接在函数类型后传入和默认值一致的泛型参数,让T被明确指定为string,此时ReturnType就能正确拿到返回值类型。注意这里必须用括号包裹完整的函数类型,否则会触发TS语法解析错误
    const success1: string = "" as ReturnType<(<T = string>() => T)<string>>;
    
  • 方案2:自定义工具类型直接提取泛型的默认参数
    写专门的条件类型通过infer关键字直接捕获泛型声明的默认值,不需要手动传参,适合需要批量提取默认类型的场景:
    // 提取无参泛型函数的第一个泛型参数默认值
    type ExtractGenericDefault<Fn> = Fn extends <T = infer DefaultType>() => any ? DefaultType : never;
    
    const success2: string = "" as ExtractGenericDefault<<T = string>() => T>;
    
  • 方案3:重写支持泛型默认值识别的ReturnType
    如果你需要保留ReturnType的调用习惯,可以自定义兼容版本,自动识别泛型默认值:
    type ReturnTypeWithGenericDefault<Fn extends (...args: any[]) => any> = 
      Fn extends <T = infer Default>() => infer R ? R : ReturnType<Fn>;
    
    const success3: string = "" as ReturnTypeWithGenericDefault<<T = string>() => T>;
    

以上方案在TypeScript 4.7+稳定版本均可正常编译通过,低版本TS对泛型默认值的infer捕获支持存在缺陷,建议升级至较新的稳定版使用。

内容的提问来源于stack exchange,提问作者Sol

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.26 23:54:18