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

如何在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.03 19:09:04