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
相关产品推荐
相关产品推荐

