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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.29 05:54:06