寻求可区分奇偶索引的类型安全OddEvenArray类型定义方案
实现奇偶索引区分的类型安全数组
OddEvenArray<Odd, Even> 要实现这种严格区分奇偶索引类型的数组,我们可以利用TypeScript的递归类型和条件判断来跟踪每个位置的类型要求,以下是具体实现:
核心类型定义
// 辅助递归类型,跟踪下一个元素的类型要求 type BuildOddEvenArray<Odd, Even, IsNextOdd extends boolean = true, Result extends unknown[] = []> = // 包含当前已构建的数组,同时递归构建更长的符合要求的数组 Result | (IsNextOdd extends true ? BuildOddEvenArray<Odd, Even, false, [...Result, Odd]> : BuildOddEvenArray<Odd, Even, true, [...Result, Even]>); // 对外暴露的公共类型 type OddEvenArray<Odd, Even> = BuildOddEvenArray<Odd, Even>;
类型验证示例
// 完全符合要求的数组,类型检查通过 const validArr1: OddEvenArray<string, number> = ["a", 1, "b", 2]; const validArr2: OddEvenArray<string, number> = ["hello"]; const validArr3: OddEvenArray<string, number> = []; // 不符合奇偶索引类型要求的数组,会触发类型错误 const invalidArr1: OddEvenArray<string, number> = [1, "a"]; // 错误:索引0必须是string类型 const invalidArr2: OddEvenArray<string, number> = ["a", "b"]; // 错误:索引1必须是number类型
工作原理说明
BuildOddEvenArray通过IsNextOdd布尔参数跟踪下一个待添加元素的类型:初始状态下IsNextOdd为true,所以第一个元素必须是Odd类型;添加后切换为false,下一个元素强制为Even类型,以此循环交替。- 递归过程中每次返回当前构建完成的数组类型,同时继续递归生成更长的符合规则的数组,覆盖了所有可能的合法长度(空数组、奇数长度、偶数长度)。
- 该类型完全适配JSON数组结构,因为JSON中的数组都是有限长度,TypeScript的递归深度限制足以覆盖日常开发中遇到的数组长度。
扩展:强制偶数长度的奇偶数组
如果需要限制数组必须为偶数长度(即严格成对出现),可以基于上面的类型做扩展:
type EvenLengthOddEvenArray<Odd, Even> = Exclude<OddEvenArray<Odd, Even>, { length: odd }>; // 验证:只有偶数长度的数组能通过检查 const evenValidArr: EvenLengthOddEvenArray<string, number> = ["a", 1, "b", 2]; // 通过 const oddInvalidArr: EvenLengthOddEvenArray<string, number> = ["a"]; // 报错:数组长度为奇数,不符合要求
内容的提问来源于stack exchange,提问作者Florian Reisinger
相关产品推荐
相关产品推荐

