TypeScript中如何截取元组的第i和第i-1个元素?
在TypeScript中截取元组的第i和i-1个元素
TypeScript本身不支持直接对元组索引做算术运算,但可以通过自定义类型工具实现这个需求。下面提供两种可行的方案:
方法1:用辅助类型实现数字索引减1
首先定义一个MinusOne类型,利用数组长度模拟数字减法,实现字面量数字减1的效果:
type MinusOne<N extends number, Acc extends any[] = []> = [...Acc, 1]['length'] extends N ? Acc['length'] : MinusOne<N, [...Acc, 1]>;
接着定义目标类型B,约束传入的索引U不能为0(避免出现无效的负索引),再通过MinusOne获取前一个位置的元素:
type A = [string, number, symbol, boolean]; type B<T extends any[], U extends Exclude<keyof T, 0>> = [T[MinusOne<U & number>], T[U]]; type C = B<A, 2>; // 得到 [number, symbol] type D = B<A, 3>; // 得到 [symbol, boolean]
方法2:通过递归拆分元组遍历实现
另一种思路是递归拆分元组,遍历过程中记录当前元素的前一个元素,直到抵达目标索引:
type PrevAndCurrent<T extends any[], U extends number, Count extends any[] = [], Prev = never> = Count['length'] extends U ? [Prev, T[0]] : T extends [infer First, ...infer Rest] ? PrevAndCurrent<Rest, U, [...Count, 1], First> : never; type A = [string, number, symbol, boolean]; type B<T extends any[], U extends keyof T> = PrevAndCurrent<T, U & number>; type C = B<A, 2>; // 得到 [number, symbol] type D = B<A, 3>; // 得到 [symbol, boolean]
内容的提问来源于stack exchange,提问作者Adam B.
相关产品推荐
相关产品推荐

