TypeScript如何校验字符串是否匹配字面量联合类型,无需手动枚举值数组?
TypeScript 字符串联合类型运行时校验实现方案
因为 TypeScript 的类型仅存在于编译期,运行时会被完全擦除,所以没法直接用联合类型做运行时校验。你可以通过以下几种方案避免硬编码重复的枚举值:
- 方案1:从运行时常量数组推导联合类型(最推荐,只需维护一份枚举值)
先定义字面量常量数组,再从数组自动生成联合类型,校验逻辑直接复用数组即可:
后续新增枚举值只需修改// 仅需维护这一个数组,as const 确保类型收窄为字面量元组 const UNION_VALUES = ['one', 'two', 'three'] as const; // 自动推导联合类型,无需手动重复写枚举值 type UnionType = typeof UNION_VALUES[number]; const myNumber: string = 'just a string'; // 类型守卫校验函数 function isUnionType(value: string): value is UnionType { return (UNION_VALUES as readonly string[]).includes(value); } // 使用示例 if (isUnionType(myNumber)) { // 此处 myNumber 会被自动收窄为 UnionType 类型 }UNION_VALUES数组,类型和校验逻辑会自动同步,不会出现不一致问题。 - 方案2:基于枚举实现
如果你需要更结构化的枚举管理,可以用TS枚举,枚举本身会保留运行时实体,直接取枚举值集合做校验:enum UnionEnum { One = 'one', Two = 'two', Three = 'three' } // 联合类型可以直接用 UnionEnum,也可以按需派生 type UnionType = `${UnionEnum}`; function isUnionType(value: string): value is UnionEnum { return Object.values(UnionEnum).includes(value as UnionEnum); } - 方案3:适配第三方已有联合类型的场景
如果联合类型是第三方定义的、你无法修改来源,可以给校验数组加类型约束,确保数组和联合类型完全对齐,少写/错写枚举值会直接触发编译报错:// 假设该类型为第三方导入的已有定义 type UnionType = 'one' | 'two' | 'three'; // 数组类型约束确保其包含所有UnionType的取值,不会漏写 const UNION_VALUES: [UnionType, ...UnionType[]] = ['one', 'two', 'three']; function isUnionType(value: string): value is UnionType { return (UNION_VALUES as string[]).includes(value); }
内容的提问来源于stack exchange,提问作者dannyxnda
相关产品推荐
相关产品推荐

