TypeScript:如何在一次调用中同时传递和推断泛型类型参数
解决方案:通过柯里化实现部分泛型参数指定+自动推断
在TypeScript中,直接调用泛型函数时无法只指定部分泛型参数(其余参数自动推断),但可以通过**柯里化(Currying)**将函数拆分为两个阶段,实现先指定第一个泛型参数,再让编译器自动推断第二个参数的类型。
实现代码
function passAndInferType<S>() { // 返回的内层函数自动推断T的类型 return <T>(arg1: S, arg2: T) => { return { arg1, arg2 }; }; }
验证场景
- 完全自动推断两个参数类型
const test = passAndInferType()('hello', 'world'); // 类型自动推断为:{ arg1: string; arg2: string }
- 自动推断第二个参数的复杂类型
const test2 = passAndInferType()('hello', { foo: 'bar' }); // 类型自动推断为:{ arg1: string; arg2: { foo: string } }
- 指定第一个参数类型,第二个参数类型不匹配时报错(符合预期)
const test3 = passAndInferType<boolean>()(false, { foo: 'bar' }); // 报错:类型"{ foo: string; }"的参数不能赋给类型"string"的参数
- 指定第一个参数类型,自动推断第二个参数类型(满足需求)
const test4 = passAndInferType<boolean>()(false, { foo: 'bar' }); // 类型正确推断为:{ arg1: boolean; arg2: { foo: string } }
原理说明
将原函数拆分为两层:
- 外层函数仅接收泛型参数
S,用于显式指定第一个参数的类型; - 内层函数接收两个参数,其中
arg1的类型由外层指定的S约束,arg2的类型T由编译器自动推断。
这种方式完美解决了“部分指定泛型参数,其余自动推断”的需求。
内容的提问来源于stack exchange,提问作者Michael.Lumley
相关产品推荐
相关产品推荐

