如何实现移除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
相关产品推荐
相关产品推荐

