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

TypeScript中如何检查值是否属于某一组枚举值?

TypeScript 中检查值是否属于枚举子集的方案

你想要实现类似Java中EnumSet的功能,在TypeScript里无需为每个枚举编写冗余辅助类,同时避免使用过时的命名空间,这里有几种更简洁实用的方案:

1. 直接扩展枚举对象(无需命名空间)

TypeScript的枚举本质是对象,可以直接为其添加静态属性,无需额外定义命名空间:

export enum Animal {
  CAT,
  DOG,
  BIRD,
  SNAKE
}

// 直接给枚举添加子集属性
Animal.Mammals = [Animal.CAT, Animal.DOG];

// 用法示例
const myPet = Animal.CAT;
console.log(Animal.Mammals.includes(myPet)); // 输出 true

如果开启严格类型检查,需提前声明枚举的扩展属性类型:

declare module './your-enum-file-path' {
  enum Animal {
    Mammals: Animal[];
  }
}

2. 通用工具函数(多枚举场景复用)

如果需要频繁处理不同枚举的子集检查,可以编写通用工具函数,减少重复代码:

function isInEnumSubset<T>(value: unknown, subset: T[]): value is T {
  return subset.includes(value as T);
}

// 用法示例
const mammalSubset = [Animal.CAT, Animal.DOG];
const myPet = Animal.BIRD;
if (isInEnumSubset(myPet, mammalSubset)) {
  // 此处myPet会被类型推断为 Animal.CAT | Animal.DOG
  console.log("是哺乳动物");
} else {
  console.log("不是哺乳动物");
}

3. 联合类型+类型守卫(强类型约束)

如果需要对枚举子集做严格的类型校验,可以先定义联合类型,再搭配类型守卫函数:

export enum Animal {
  CAT,
  DOG,
  BIRD,
  SNAKE
}

// 定义哺乳动物的联合类型
type Mammal = Animal.CAT | Animal.DOG;

// 类型守卫函数
function isMammal(value: Animal): value is Mammal {
  return [Animal.CAT, Animal.DOG].includes(value);
}

// 用法示例
const myPet = Animal.DOG;
if (isMammal(myPet)) {
  // 此处myPet类型被约束为Mammal
  console.log("属于哺乳动物");
}

方案对比

你之前使用命名空间的方案虽能统一用法,但TypeScript的命名空间在ES模块环境下已逐渐被淘汰。上述方案中:

  • 直接扩展枚举对象的写法最简洁,保持了枚举的统一访问方式;
  • 通用工具函数适合多枚举场景,复用性最强;
  • 联合类型+类型守卫的方式能提供最严格的类型安全保障,适合对类型校验要求高的场景。

内容的提问来源于stack exchange,提问作者noamyg

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.18 22:55:23