我希望构建一种基于索引将元组拆分成两个块的类型,例如
type TupleToChunksAt<N extends number, T extends any[]> = // ??
type Test = TupleToChunksAt<1, [1, 2, 3]> // [[1], [2, 3]]
我希望构建一种基于索引将元组拆分成两个块的类型,例如
type TupleToChunksAt<N extends number, T extends any[]> = // ??
type Test = TupleToChunksAt<1, [1, 2, 3]> // [[1], [2, 3]]
我通常将其称为SplitAt
(当然,您也可以将其称为TupleToChunksAt
,如果您愿意,可以更改我的类型参数顺序).我能想到的最简单的tail-recursive conditional type个是这样的:
type SplitAt<T extends any[], N extends number, A extends any[] = []> =
N extends A['length'] ? [A, T] : T extends [infer F, ...infer R] ?
SplitAt<R, N, [...A, F]> : [A, T];
它使用variadic tuple types来拆分/联接tuple types.累加器A
存储分割左侧的部分,并用空元组进行初始化.当长度A
到达所需的拆分位置N
时,或者当输入元组为空时,递归终止,我们返回A
作为左侧部分,T
作为右侧部分.否则,我们将从T
中剥离第一个元素,并将其附加到A
和Recurse.
您可以看到它的行为符合预期:
type Test = SplitAt<[1, 2, 3], 1>;
// type Test = [[1], [2, 3]]