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

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.

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.06 08:43:20