TypeScript中如何从单个枚举值获取所有枚举值?
问题解答
没办法直接从枚举值反向推断出它所属的枚举类型——因为TypeScript枚举编译后在运行时就是普通对象,枚举值本质就是字符串或数字,本身不携带任何所属枚举的元信息,而且不同枚举完全可能包含相同的成员值。
不过可以通过以下两种替代方案实现类似需求:
方案一:提前维护枚举集合,遍历匹配
把所有可能的枚举统一存到一个映射对象里,然后遍历查找包含目标值的枚举:
// 定义示例枚举 enum MyNumber { ONE='ONE', TWO='TWO', THREE='THREE', FOUR='FOUR', FIVE='FIVE', } enum MyColor { RED='RED', GREEN='GREEN', BLUE='BLUE', } // 维护所有需要检测的枚举 const allEnums = { MyNumber, MyColor }; // 根据枚举值查找所属枚举 function findEnumByValue(value: string | number) { for (const enumObj of Object.values(allEnums)) { if (Object.values(enumObj).includes(value)) { return enumObj; } } return null; } // 使用示例 const myVar = MyNumber.ONE; const targetEnum = findEnumByValue(myVar); if (targetEnum) { console.log(Object.values(targetEnum)); // 输出 ["ONE", "TWO", "THREE", "FOUR", "FIVE"] }
注意:如果多个枚举存在相同的成员值,这个方法会返回第一个匹配到的枚举,需要根据业务场景处理冲突情况。
方案二:自定义枚举结构,附加元信息
修改枚举的定义形式,给每个枚举值附加所属枚举的标识,让值本身携带归属信息:
// 定义带元信息的枚举成员类型 interface TypedEnumMember { value: string; enumKey: string; } // 自定义枚举结构 const MyNumber = { ONE: { value: 'ONE', enumKey: 'MyNumber' } as TypedEnumMember, TWO: { value: 'TWO', enumKey: 'MyNumber' } as TypedEnumMember, THREE: { value: 'THREE', enumKey: 'MyNumber' } as TypedEnumMember, FOUR: { value: 'FOUR', enumKey: 'MyNumber' } as TypedEnumMember, FIVE: { value: 'FIVE', enumKey: 'MyNumber' } as TypedEnumMember, }; const MyColor = { RED: { value: 'RED', enumKey: 'MyColor' } as TypedEnumMember, GREEN: { value: 'GREEN', enumKey: 'MyColor' } as TypedEnumMember, BLUE: { value: 'BLUE', enumKey: 'MyColor' } as TypedEnumMember, }; // 维护枚举映射 const enumMap = { MyNumber, MyColor }; // 使用示例 const myVar = MyNumber.ONE; const targetEnum = enumMap[myVar.enumKey]; // 提取枚举值列表 const enumValues = Object.values(targetEnum).map(item => item.value); console.log(enumValues); // 输出 ["ONE", "TWO", "THREE", "FOUR", "FIVE"]
这种方式需要调整枚举的定义逻辑,但能准确关联枚举值和所属枚举,避免冲突问题。
内容的提问来源于stack exchange,提问作者s-hunter
相关产品推荐
相关产品推荐

