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
相关产品推荐
相关产品推荐

