显式指定第一个泛型参数时,如何实现第二个泛型参数的类型推断?
问题解决:显式指定第一个泛型时让第二个自动推断
在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() {}, });
原理说明
通过柯里化,我们把原函数拆分为两步:
- 第一步显式指定泛型
T,此时返回的新函数会捕获这个T的类型。 - 第二步传入
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
相关产品推荐
相关产品推荐

