TypeScript中如何移除ConstructorParameters返回元组的第一个类型?
移除构造函数参数元组的第一个元素
当然可以实现这个需求!在TypeScript中,我们可以借助条件类型和infer关键字,轻松写出一个通用的类型工具,用来移除元组的第一个元素,而且这个方案完全适配参数数量≥1的任意构造函数场景。
实现通用类型工具
首先定义一个自定义类型RemoveFirstParameter,它会接收一个元组类型,并返回移除第一个元素后的新元组:
type RemoveFirstParameter<T extends any[]> = T extends [infer _, ...infer Rest] ? Rest : never;
类型解释:
T extends any[]:约束输入必须是一个元组类型(完全匹配ConstructorParameters的返回类型)。[infer _, ...infer Rest]:用infer关键字捕获元组的第一个元素(用_表示我们不需要保留这个值),同时用剩余元素语法...infer Rest捕获剩下的所有元素,组成新的元组。- 因为我们的场景是构造函数参数数量≥1,所以这个条件永远会匹配成功,不会走到
never分支。
结合构造函数参数使用
接下来把这个类型工具和ConstructorParameters结合,就能得到你想要的结果:
// 示例类 class Foo { constructor(a: number, b: string, c?: string) {} } // 获取原始构造函数参数元组 type OriginalParams = ConstructorParameters<typeof Foo>; // 类型为 [number, string, string | undefined] // 移除第一个元素后的元组 type ParamsWithoutFirst = RemoveFirstParameter<OriginalParams>; // 类型为 [string, string | undefined]
验证通用性
这个方案对任意参数数量≥1的构造函数都有效:
- 当构造函数只有1个参数时:
class Bar { constructor(x: boolean) {} } type BarParams = RemoveFirstParameter<ConstructorParameters<typeof Bar>>; // 类型为 []
- 当构造函数有多个参数时:
class Baz { constructor(id: number, name: string, age: number, active: boolean) {} } type BazParams = RemoveFirstParameter<ConstructorParameters<typeof Baz>>; // 类型为 [string, number, boolean]
这样就能完美满足你的需求啦!
内容的提问来源于stack exchange,提问作者Lehks
相关产品推荐
相关产品推荐

