如何在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"不属于枚举键类型
类型工作原理
readonly T[]:基础约束数组元素必须是目标类型T的成员;Exclude<T, this[number]> extends never:检查目标类型T的所有成员都被数组元素覆盖,若存在未覆盖的成员则触发类型错误;this[number] extends T:确保数组中的每个元素都属于目标类型T,避免出现多余的无效元素。
这种方案仅在编译阶段生效,不会增加运行时开销,且适用于任意字符串、数字联合类型,不限于枚举键。
内容的提问来源于stack exchange,提问作者srhuevo
相关产品推荐
相关产品推荐

