TypeScript可选泛型类型无法推断的问题及解决方法咨询
解决TypeScript部分泛型指定、其余自动推断的问题
TypeScript本身不支持直接“部分显式指定泛型参数,剩余参数自动推断”的语法,但可以通过柯里化(Currying)拆分函数的方式实现这个需求。
柯里化改造方案
把原函数拆分为两层调用:第一层接收需要手动指定泛型的参数,第二层接收剩余参数让TypeScript自动推断对应的泛型。
改造后的代码示例:
// 拆分为两层函数,第一层指定Foo泛型,第二层自动推断Bar function test<Foo = unknown>(foo: Foo) { return function<Bar = undefined>(bar: Bar) { return { foo, bar: [bar] }; }; }
使用方式:
// 手动指定Foo为number,Bar自动从参数'bar'推断为string const b = test<number>(10)('bar'); // 返回类型:{ foo: number; bar: string[] },符合预期 // 不指定任何泛型,全部自动推断 const a = test(10)('bar'); // 返回类型:{ foo: number; bar: string[] } // 也可以手动指定两个泛型参数 const c = test<number>(10)<string>('bar');
原理说明
柯里化通过拆分函数调用,让第一层函数锁定需要手动指定的泛型类型,第二层函数则可以完全基于传入的参数自动推断剩余泛型,完美避开了TypeScript中“要么全显式指定泛型,要么全自动推断”的限制。
内容的提问来源于stack exchange,提问作者NyTrOuS
相关产品推荐
相关产品推荐

