TypeScript无法推断第二个泛型参数的原因及解决方法
为何调用infer2时无法推断泛型参数T?该如何解决?
代码示例
function infer1<T>(arg: T) { return arg; } infer1(123); // 正常:123是number类型,T被推断为number function infer2<S, T>(arg: T) { return arg; } infer2<string>(123); // 报错:Expected 2 type arguments, but got 1.(2558)
原因
TypeScript的泛型规则是:泛型类型参数要么全部由编译器自动推断,要么全部手动显式传入(除非参数有默认值)。当你显式传入了第一个泛型参数<string>,编译器会默认要求你手动指定所有泛型参数,不会再自动推断剩余的T,因此抛出参数数量不匹配的错误。
解决方法
1. 给泛型参数设置默认值
如果S有合理的默认类型,可以为其指定默认值,这样即使只传入部分参数,编译器也能自动推断剩余参数:
function infer2<S = never, T>(arg: T) { return arg; } infer2<string>(123); // T被正确推断为number
2. 使用部分类型参数推断(TypeScript 3.4+)
TypeScript 3.4及以上支持部分显式指定+部分推断,你可以用_(TypeScript 4.7+推荐)或unknown作为占位符,让编译器自动推断剩余参数:
// TypeScript 4.7+ 推荐写法 infer2<string, _>(123); // T被推断为number // 兼容旧版本的写法 infer2<string, unknown>(123); // 编译器会用实际参数类型覆盖unknown,T最终为number
3. 拆分泛型参数(柯里化)
如果业务场景允许,可将需要手动指定的泛型参数和需要推断的参数拆分到不同函数层级,用柯里化实现:
function infer2<S>() { return function <T>(arg: T) { return arg; }; } infer2<string>()(123); // S为string,T自动推断为number
内容的提问来源于stack exchange,提问作者Page not found
相关产品推荐
相关产品推荐

