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

如何实现移除TypeScript泛型默认参数的工具类型RemoveDefaults?

移除TypeScript泛型类型的默认参数

假设我们有如下泛型类型:

type T<A = object, B = number> = {
  a: A,
  b: B,
}

我们希望实现一个RemoveDefaults类型,使得TNoDefault = RemoveDefaults<T>之后,TNoDefault不再带有A和B的默认参数,使用时必须显式传入两个类型参数,比如TNoDefault<number, number>。

这个需求是可行的,利用TypeScript的条件类型与泛型推断能力,我们可以实现通用的RemoveDefaults类型,处理任意数量泛型参数的场景:

type RemoveDefaults<T> = 
  // 处理泛型函数类型
  T extends <...P extends any[]>(...args: never[]) => infer R
    ? <...P>(...args: never[]) => R
    : 
  // 处理泛型构造函数类型
  T extends new <...P extends any[]>(...args: never[]) => infer R
    ? new <...P>(...args: never[]) => R
    : 
  // 递归处理嵌套泛型的类型别名/接口
  T extends { [K in keyof T]: infer U }
    ? { [K in keyof T]: RemoveDefaults<U> }
    : T;

测试验证

type T<A = object, B = number> = {
  a: A,
  b: B,
};

type TNoDefault = RemoveDefaults<T>;

// 使用时必须显式传入两个类型参数,否则会触发类型报错
const test: TNoDefault<number, string> = { a: 123, b: "hello" };

这个实现依赖TypeScript 4.7及以上版本,因为用到了infer ...P extends any[]这种Rest泛型推断语法,它可以提取原泛型的所有参数列表,然后重新构造一个不带默认值的泛型结构。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.17 02:19:55