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

TypeScript如何仅覆写带默认值的泛型中的部分参数

答案

TypeScript 暂不支持你设想的用_作为占位符、跳过前序泛型参数直接使用默认值的写法。

TypeScript 的泛型参数是按位置顺序匹配的,只有当你省略某一位置以及其之后所有的泛型参数时,该位置的默认值才会生效。举个例子,你定义的Test类有两个带默认值的泛型参数,你可以选择不传入任何泛型参数,此时两个参数都用默认值;也可以只传入第一个参数,此时第二个参数用默认值;但不能跳过第一个参数只传入第二个。


替代方案1:提前抽离公共默认类型

把泛型的默认值提前定义为独立的公共类型,需要复用时直接引用即可:

// 抽离默认类型,泛型定义和后续复用都统一用这套
type TestDefaultA = myObjectType
type TestDefaultB = myOtherObjectType

class Test<A extends myObjectType = TestDefaultA, B extends myOtherObjectType = TestDefaultB> {};

// 继承时直接引用提前定义的默认类型,无需重复写类型定义
class SecondTest extends Test<TestDefaultA, myChangedObjectType> {}

替代方案2:自动推断原泛型的默认类型

如果不想额外定义公共类型,也可以通过类型推断直接从原类中提取默认类型:

// 自动提取Test类的第一个泛型参数的默认类型
type TestDefaultA = Test extends Test<infer A, any> ? A : never

class SecondTest extends Test<TestDefaultA, myChangedObjectType> {}

替代方案3:调整泛型参数顺序

如果你经常需要修改靠后的泛型参数,可以直接调整泛型定义的顺序,把不需要经常修改、默认值使用频率高的参数放在末尾:

// 把不常改的A放末尾,需要经常改的B放前面
class Test<B extends myOtherObjectType = myOtherObjectType, A extends myObjectType = myObjectType> {};

// 此时就可以只传B的自定义类型,A自动用默认值
class SecondTest extends Test<myChangedObjectType> {}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.29 05:45:05