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

显式指定第一个泛型参数时,如何实现第二个泛型参数的类型推断?

问题解决:显式指定第一个泛型时让第二个自动推断

在TypeScript中,当你显式指定函数的某一个泛型参数后,剩余泛型会优先使用默认值而非自动推断,这就是你遇到的问题。要解决这个,我们可以通过柯里化拆分函数调用,把需要显式指定的泛型参数和需要自动推断的参数分离开。

修改后的代码示例

type Definition<T, U> = U & ThisType<T & U>;

// 柯里化:先指定泛型T,再传入参数让TS自动推断U
function foo<T>() {
  return function<U extends object>(
    name: string,
    definition: Definition<T, U>
  ) {}
}

// 调用方式:先指定T,再传参数,U会自动推断为传入的definition类型
foo<{ b: string }>()("a", {
  a() {
    this.b; // 正常识别T的属性
    this.c(); // 现在可以正常调用,U已推断为包含c()的类型
    // @ts-expect-error
    this.notDefined; // 仍会正确报错
  },
  c() {},
});

原理说明

通过柯里化,我们把原函数拆分为两步:

  1. 第一步显式指定泛型T,此时返回的新函数会捕获这个T的类型。
  2. 第二步传入name和definition时,TypeScript可以完全基于传入的definition自动推断出U的类型,不会再使用默认值覆盖。

这种方式既保留了显式指定T的能力,又让U能自动推断,完美匹配你的需求。

替代方案(不推荐)

如果你不想使用柯里化,也可以手动给U指定类型,但这会失去自动推断的便利性,且容易出错:

// 手动指定U的类型,不推荐
foo<{ b: string }, { a(): void; c(): void }>("a", {
  a() {
    this.b;
    this.c();
  },
  c() {},
});

内容的提问来源于stack exchange,提问作者mtsmfm

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.09 18:14:51