You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

指定泛型参数时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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.07 21:15:10