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

如何在TypeScript编译时确保数组包含枚举的所有键?

TypeScript编译时确保数组包含枚举所有键的实现方法

可以通过自定义TypeScript类型实现编译时的严格检查,确保数组包含目标枚举的所有键,同时不包含多余元素。

核心类型定义

type EnsureAllKeys<T> = 
  readonly T[] & 
  // 确保数组包含所有目标键,无遗漏
  (Exclude<T, this[number]> extends never ? unknown : never) &
  // 确保数组没有多余元素
  (this[number] extends T ? unknown : never);

结合枚举的使用示例

enum Ej {
  A = "A",
  B = "B"
}

// 合法:包含所有枚举键,顺序不影响
const ejArr1: EnsureAllKeys<keyof typeof Ej> = ["A", "B"]; // ✅
const ejArr12: EnsureAllKeys<keyof typeof Ej> = ["B", "A"]; // ✅

// 非法:缺少枚举键
const ejArr2: EnsureAllKeys<keyof typeof Ej> = ["A"]; // ❌ 类型报错:存在未包含的枚举键"B"
const ejArr3: EnsureAllKeys<keyof typeof Ej> = ["B"]; // ❌ 类型报错:存在未包含的枚举键"A"

// 非法:包含多余元素
const ejArr4: EnsureAllKeys<keyof typeof Ej> = ["A", "B", "C"]; // ❌ 类型报错:"C"不属于枚举键类型

类型工作原理

  1. readonly T[]:基础约束数组元素必须是目标类型T的成员;
  2. Exclude<T, this[number]> extends never:检查目标类型T的所有成员都被数组元素覆盖,若存在未覆盖的成员则触发类型错误;
  3. this[number] extends T:确保数组中的每个元素都属于目标类型T,避免出现多余的无效元素。

这种方案仅在编译阶段生效,不会增加运行时开销,且适用于任意字符串、数字联合类型,不限于枚举键。

内容的提问来源于stack exchange,提问作者srhuevo

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.08 01:57:28