TypeScript中用Exclude筛选enum后如何得到可运行的enum
从现有TypeScript枚举中提取部分成员生成可运行时使用的枚举的实现方案
核心前提
TypeScript 中通过
Exclude等泛型工具生成的联合类型属于纯编译时概念,编译完成后会被完全擦除,无法在运行时的JavaScript逻辑(比如分支判断、函数取值)中访问使用。所有仅依赖类型系统的操作都不会产生运行时代码,因此永远无法直接生成可在JS逻辑中使用的枚举值结构。要实现可运行的部分成员枚举,必须生成对应的真实JS结构。
具体实现方案
方案1:基于原枚举值手动定义新枚举(兼容性最优)
这是无额外配置、最稳妥的原生TS写法,直接在新枚举中引用原枚举的对应值,保证新旧枚举值完全一致:
// 原有全量枚举 enum Operator { EQUAL = 'EQUAL', NOT_EQUAL = 'NOT_EQUAL', LESS = 'LESS', GREATER = 'GREATER', } // 筛选需要的成员,生成新的可运行枚举 enum EqualOperators { EQUAL = Operator.EQUAL, NOT_EQUAL = Operator.NOT_EQUAL, }
- 优势:完全匹配TypeScript枚举的原生行为,编译后生成的结构和普通枚举无差异,支持所有枚举的使用场景
- 可靠性:由于直接引用原枚举的成员值,不会出现新旧枚举值不一致的问题
方案2:用常量对象模拟枚举(减少样板代码)
TypeScript 的枚举编译后本质是一个带键值映射的普通对象,我们可以通过as const修饰的常量对象实现等价的运行时效果,同时自动推导对应的联合类型:
// 从原枚举中筛选需要的成员,生成冻结常量结构 const EqualOperators = { EQUAL: Operator.EQUAL, NOT_EQUAL: Operator.NOT_EQUAL, } as const; // 自动推导对应的联合类型,替代之前的Exclude写法 type EqualOperatorsValue = typeof EqualOperators[keyof typeof EqualOperators];
- 优势:减少枚举声明的重复代码,
as const修饰的对象是冻结状态,值无法被意外修改,类型推导全程自动完成,不需要手动维护类型和值的对应关系 - 体验一致:这个常量对象完全可以在JS函数的分支判断中直接使用,和枚举的运行时使用体验没有区别
效果验证
两种方案生成的结构,都可以直接在示例的函数逻辑中正常使用,不存在运行时限制:
function getOperator() { if (EqualOperators.EQUAL) { return "="; } if (EqualOperators.NOT_EQUAL) { return "!="; } throw new Error('invalid operator'); }
内容的提问来源于stack exchange,提问作者Jimmy
相关产品推荐
相关产品推荐

