TypeScript泛型如何跳过带默认值的前置参数仅传入后续参数
核心结论
TypeScript 目前不支持你期望的Foo<,string>这种跳过前置泛型参数的语法,泛型参数是按位置匹配的,要指定后续参数必须先传入前置参数。
为什么你之前的尝试不符合要求
never和unknown都是显式传入的类型,会覆盖泛型的默认值,不会触发默认的string类型- 直接提取
Foo['t']的方式如果不封装的话每次都要写,且耦合了属性名,通用性差
可行的实现方案
方案1:调整泛型参数顺序(最推荐)
把你更常自定义的参数放到更靠前的位置,较少修改、用默认值更多的参数放到后面:
// 调整顺序,把常用的U放在前面,T放在后面用默认值 type Foo<U = number, T = string> = { t: T u: U } // 直接传自定义的U即可,自动沿用T的默认值string type G = Foo<string> // G的类型为 { t: string; u: string },完全符合预期
方案2:封装派生工具类型(无法修改原泛型定义时用)
如果不能改动原Foo的定义,可以封装一个预填了前置参数默认值的派生类型,只暴露需要自定义的参数:
// 原泛型定义保持不变 type Foo<T = string, U = number> = { t: T u: U } // 先获取原泛型全默认实例的类型,后续原泛型默认值修改时会自动同步 type DefaultFoo = Foo // 封装派生类型,预填T的默认值,仅暴露U供自定义 type FooWithCustomU<U = DefaultFoo['u']> = Foo<DefaultFoo['t'], U> type G = FooWithCustomU<string> // G的类型为 { t: string; u: string },符合预期
内容的提问来源于stack exchange,提问作者david_adler
相关产品推荐
相关产品推荐

