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

寻求可区分奇偶索引的类型安全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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.07 03:01:11