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

TypeScript中如何根据数值获取枚举包含的所有Flag值列表

通用非连续Flag枚举解析方案

实现逻辑

  • TypeScript数字枚举编译后会生成双向映射结构,我们可以直接从传入的枚举对象中过滤出所有数值类型的枚举值,完全避免硬编码
  • 基于动态提取的枚举值列表执行按位与判断,可适配任意非连续的2的幂次Flag枚举场景

完整代码

// 通用解析函数,第一个参数直接传入枚举类即可
function getFlagEnumValues<T extends object>(enumObj: T, flags: number): T[keyof T][] {
  // 过滤掉枚举反向映射生成的字符串值,仅保留数值类型的枚举成员
  const enumValues = Object.values(enumObj).filter(val => typeof val === 'number') as T[keyof T][];
  const result: T[keyof T][] = [];
  for (const val of enumValues) {
    if ((Number(val) & flags) !== 0) {
      result.push(val);
    }
  }
  return result;
}

使用示例

enum Enum {
    one = 1,
    four = 4,
    sixteen = 16,
}

const Flags: number = 20;
// 调用时传入枚举对象即可,后续枚举变更无需修改函数逻辑
console.log(getFlagEnumValues(Enum, Flags)); // 输出 [4, 16]

该方案不限制枚举值的连续性,只要枚举值是符合Flag规则的2的幂次即可正常工作,枚举增删成员时仅需要调整枚举定义即可。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.01 07:39:02