如何在TypeScript中对数组元组类型进行解构生成新类型
你需要的类似类型解构的效果在TypeScript里有非常简洁的实现方案,不需要手动写索引取元素:
方案1:通用工具类型实现(全版本兼容)
我们可以封装通用的元组处理工具类,自动提取需要的部分,可复用性极强:
// 提取元组首元素类型 type Head<T extends any[]> = T extends [infer First, ...infer _Rest] ? First : never; // 提取元组去掉首元素后的剩余部分 type Tail<T extends any[]> = T extends [infer _First, ...infer Rest] ? Rest : never; // 原始类型 type Args = [foo: string, bar: number, baz: number]; // 使用效果 type Foo = Head<Args>; // 等价于 string type NewArgs = Tail<Args>; // 等价于 [bar: number, baz: number]
这个方案不需要关心原元组的长度,后续Args新增、修改元素时,Head和Tail返回的结果会自动同步更新,完全不需要手动修改代码。
方案2:直接解构(TypeScript 4.6+ 支持)
高版本TypeScript已经原生支持元组类型的解构写法,你问题里的写法几乎可以直接用:
type Args = [foo: string, bar: number, baz: number]; type [Foo, ...NewArgs] = Args; // 完全符合你的预期 // Foo === string // NewArgs === [bar: number, baz: number]
扩展:支持跳过前N个元素
如果需要跳过任意数量的前序元素,可以扩展工具类型实现:
// 跳过元组前N个元素,返回剩余内容 type DropFirstN<T extends any[], N extends number, Count extends any[] = []> = Count['length'] extends N ? T : T extends [any, ...infer Rest] ? DropFirstN<Rest, N, [...Count, 1]> : T; // 示例:跳过Args前2个元素,只保留最后一个 type LastArg = DropFirstN<Args, 2>; // 等价于 [baz: number]
内容的提问来源于stack exchange,提问作者hollandThomas
相关产品推荐
相关产品推荐

