Typescript 如何访问字符串联合类型的取值进行变量相等判断?
解决方案
你定义的TestEnum是TypeScript的字符串字面量联合类型,这类类型仅在编译阶段做类型校验,不会被编译到最终的JS运行时代码中,因此无法直接通过类似TestEnum.TEST1的形式访问对应值做运行时判断,你可以选择以下任意一种方案解决:
方案1:从运行时常量推导类型
先定义运行时可用的常量集合,再从常量反向推导TS类型,保证类型和运行时取值的一致性:
// 定义运行时可用的常量数组,as const锁死值不允许修改 export const TEST_VALUES = ["TEST1", "TEST2"] as const; // 从常量数组推导联合类型 export type TestEnum = typeof TEST_VALUES[number];
判断逻辑写法:
- 单个固定值判断:直接用常量或者字面量都可以,TS会自动做类型校验和收窄
// 写法1:用预定义常量 if (yourVar === TEST_VALUES[0]) {} // 写法2:直接写字面量,TS会校验字符串合法性,写错会触发编译报错 if (yourVar === "TEST1") {} - 判断变量是否属于TestEnum的任意合法取值:
// 定义类型守卫函数 function isTestEnum(value: unknown): value is TestEnum { return TEST_VALUES.includes(value as TestEnum); } // 使用 if (isTestEnum(yourVar)) { // 此处yourVar的类型会自动被TS收窄为TestEnum }
方案2:改用TS字符串枚举
字符串枚举会被编译为运行时可用的对象,你可以直接访问枚举属性做判断:
// 定义字符串枚举 export enum TestEnum { TEST1 = "TEST1", TEST2 = "TEST2" }
判断逻辑写法:
- 单个固定值判断:
if (yourVar === TestEnum.TEST1) {} - 判断变量是否属于TestEnum的任意合法取值:
function isTestEnum(value: unknown): value is TestEnum { return Object.values(TestEnum).includes(value as TestEnum); }
内容的提问来源于stack exchange,提问作者Bian Artola
相关产品推荐
相关产品推荐

