如何从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
相关产品推荐
相关产品推荐

