You need to enable JavaScript to run this app. TypeScript中用Exclude筛选enum后如何得到可运行的enum
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.11.02 06:06:04