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

如何判断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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.06 08:09:01