如何判断TypeScript联合类型的变量属于哪个子枚举类型
解决方案
TypeScript 的类型、枚举类型仅存在于编译阶段,运行时会被完全擦除。你原本使用
typeof判断的方式无法生效:运行时typeof Mammal返回的是object,而animal是字符串类型的枚举值,typeof animal返回的是string,二者永远不可能相等。我们需要通过判断运行时的值是否属于对应枚举的取值集合,来识别归属的子枚举。
首先先修正你代码中的笔误(定义联合类型时枚举名写错、Fish枚举多余逗号),基础代码如下:
enum Mammal { bear = 'bear', human = 'human' } enum Fish { salmon = 'salmon' } type Animal = Mammal | Fish;
实现判断的两种方式
方式1:直接用Object.values检查归属
直接获取枚举的所有取值,判断当前变量是否在该集合内:
let animal = 'salmon' as Animal; // 判断是否属于Mammal枚举 if (Object.values(Mammal).includes(animal as Mammal)) { // 此处变量类型已收窄为Mammal console.log('属于哺乳动物枚举', animal); } // 判断是否属于Fish枚举 else if (Object.values(Fish).includes(animal as Fish)) { // 此处变量类型已收窄为Fish console.log('属于鱼类枚举', animal); }
方式2:封装类型守卫(更推荐)
封装专门的类型判断函数,后续使用时不需要额外类型断言,TypeScript会自动完成类型收窄,有完整的类型提示和校验:
// 封装Mammal类型守卫 function isMammal(target: Animal): target is Mammal { return Object.values(Mammal).includes(target as Mammal); } // 封装Fish类型守卫 function isFish(target: Animal): target is Fish { return Object.values(Fish).includes(target as Fish); } // 调用示例 let animal = 'salmon' as Animal; if (isMammal(animal)) { // 这里TS会自动识别animal为Mammal类型,只能访问bear、human两个枚举值 console.log(animal); } else if (isFish(animal)) { // 这里TS会自动识别animal为Fish类型,只能访问salmon枚举值 console.log(animal); }
内容的提问来源于stack exchange,提问作者JudasMoses
相关产品推荐
相关产品推荐

