如何使用TypeScript提取数组中除首个元素外的所有元素类型(含未知长度数组场景)
TypeScript数组类型元素提取问题解答
Got it, let's tackle these two TypeScript type manipulation scenarios clearly:
1. 提取数组类型中除第一个元素之外的所有元素类型
要实现这个需求,我们可以利用TypeScript的条件类型和infer关键字来捕获数组的剩余元素类型。具体的类型定义如下:
type Tail<T extends any[]> = T extends [infer _, ...infer Rest] ? Rest : never;
工作原理:
T extends any[]约束输入类型必须是数组类型[infer _, ...infer Rest]使用infer分别推断出数组的第一个元素(用_表示我们不需要使用这个变量)和剩余的所有元素(捕获到Rest中)- 如果匹配成功,就返回剩余元素的数组类型
Rest;否则返回never
举个例子,针对你给出的MyTypeArray:
type MyTypeArray = ['', 2, boolean]; type TailOfMyType = Tail<MyTypeArray>; // 结果是 [2, boolean]
2. 数组长度未知时,提取除第一个元素外的联合类型
如果我们需要把剩余元素的数组类型转换成联合类型,可以结合上面的Tail类型和TypeScript的索引访问类型T[number](它会返回数组所有元素的联合类型)。
定义如下:
type TailUnion<T extends any[]> = T extends [infer _, ...infer Rest] ? Rest[number] : never;
工作原理:
- 前面的逻辑和
Tail类型一致,先捕获剩余元素的数组类型Rest - 用
Rest[number]将数组类型转换为其元素的联合类型,无论数组长度是固定还是未知的
用你的例子测试:
type MyTypeArray = ['', 2, boolean]; type UnionResult = TailUnion<MyTypeArray>; // 结果是 2 | boolean
如果是长度未知的数组,比如:
type UnknownLengthArray = [string, ...number[]]; type UnionFromUnknown = TailUnion<UnknownLengthArray>; // 结果是 number
内容的提问来源于stack exchange,提问作者johann1301s
相关产品推荐
相关产品推荐

