我希望构建一种基于索引将元组拆分成两个块的类型,例如

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]]

Playground link to code

Typescript相关问答推荐

如何将http上下文附加到angular中翻译模块发送的请求

即使子网是公共的,AWS CDK EventBridge ECS任务也无法分配公共IP地址

如何使用Zod使一个基于其他字段值的字段为必填字段?

TypeScrip-将<;A、B、C和>之一转换为联合A|B|C

在实现自定义主题后,Angular 不会更新视图

迭代通过具有泛型值的映射类型记录

MatTool提示在角垫工作台中不起作用

函数重载中的不正确TS建议

不带其他属性的精确函数返回类型

在正常函数内部调用异步函数

界面中数组中的混合类型导致打字错误

带投掷的收窄类型

map 未显示控制台未显示任何错误@reaction-google-map/api

是否将Angular *ngFor和*ngIf迁移到新的v17语法?

如何静态键入返回数组1到n的函数

Typescript泛型-键入对象时保持推理

如何在由函数参数推断的记录类型中具有多个对象字段类型

使用受保护的路由和入门来响应路由

TS 条件类型无法识别条件参数

错误:仅允许在‘使用服务器’文件中导出异步函数