指定泛型参数时TypeScript无法正确推断类型的解决方法
TypeScript 指定部分泛型参数时自动推断剩余类型的方案
当函数包含多个泛型参数,其中部分参数必须手动指定,而另一部分希望TypeScript自动推断时,直接指定部分参数会导致剩余参数无法正常推断(如示例中R被解析为unknown)。以下是具体问题示例和解决方法:
问题示例
单个泛型参数时,TypeScript可以正常推断返回类型:
// res: boolean function foo<R>(fn: () => R) { return fn(); } const res = foo(() => true);
但添加必须指定的泛型参数X后,R的自动推断失效:
// res: unknown - 手动指定了X和R,R无法自动推断 function foo<X, R>(fn: () => R) { return fn(); } const res = foo<string, unknown>(() => true); // res: unknown - 指定X后,R使用默认值unknown,未自动推断 function foo<X, R = unknown>(fn: () => R) { return fn(); } const res = foo<string>(() => true); // res: boolean - 不指定任何泛型参数时可正常推断,但无法指定X function foo<X, R = unknown>(fn: () => R) { return fn(); } const res = foo(() => true); // res: boolean - 需手动指定R,不符合需求 function foo<X, R>(fn: () => R) { return fn(); } const res = foo<string, boolean>(() => true);
解决方法
方法1:柯里化拆分泛型参数(兼容TS 4.6.4)
将函数拆分为两次调用,第一次指定X,第二次传入函数让TypeScript自动推断R:
function foo<X>() { return function <R>(fn: () => R): R { return fn(); }; } // 先指定X,再传入回调,R自动推断为boolean const res = foo<string>()(() => true); // res: boolean
通过柯里化拆分泛型参数的作用域,让两次调用分别处理不同的泛型参数,既满足指定X的需求,又保留R的自动推断能力。
方法2:使用推断占位符(需升级到TS 4.7+)
TypeScript 4.7及以上版本支持用_作为泛型推断占位符,显式告知编译器对该参数进行自动推断:
function foo<X, R>(fn: () => R) { return fn(); } // 使用_让TS自动推断R的类型 const res = foo<string, _>(() => true); // res: boolean
若可以升级TypeScript版本,这种方式更简洁,但不适用于你的4.6.4版本。
内容的提问来源于stack exchange,提问作者kjetilh
相关产品推荐
相关产品推荐

