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

能否从TypeScript字符串字面量联合类型创建枚举?

从字符串字面量联合类型创建枚举的可行性

直接通过TypeScript的类型系统,从字符串字面量联合类型生成枚举做不到。核心原因是:TypeScript的类型(包括你定义的Type)是编译时才存在的概念,编译成JavaScript后就会被完全擦除;而枚举是运行时真实存在的JavaScript对象,TypeScript没办法把仅存在于类型层面的信息,自动转化为运行时的枚举结构。

不过有几种变通方案可以实现类似需求:

方案1:共享运行时数据源,同时生成类型和枚举

先定义一个运行时的常量对象,以此为唯一数据源,同时生成字面量联合类型和枚举:

// 运行时的常量对象,作为唯一数据源
const typeSource = {
  EnumValueA: 'EnumValueA',
  EnumValueB: 'EnumValueB'
} as const;

// 基于对象生成字符串字面量联合类型
type Type = keyof typeof typeSource; // 得到 'EnumValueA' | 'EnumValueB'

// 基于对象创建枚举
enum Enum {
  EnumValueA = typeSource.EnumValueA,
  EnumValueB = typeSource.EnumValueB
}

这种方式避免了重复定义,类型和枚举始终保持一致。

方案2:用const enum实现编译时枚举(反向操作)

如果只需要编译时的枚举类型检查,不需要运行时的枚举对象,可以用const enum,但本质是先定义枚举再生成类型(和你想要的方向相反):

const enum Enum {
  EnumValueA,
  EnumValueB
}

// 从枚举生成字符串字面量联合类型
type Type = keyof typeof Enum; // 'EnumValueA' | 'EnumValueB'

const enum只会在编译阶段存在,编译后不会生成对应的JavaScript对象,适合只需要类型约束的场景。

方案3:借助代码生成工具

如果必须从已有的字面量联合类型生成枚举,可以用ts-morph这类操作TypeScript AST的工具,在构建阶段读取类型信息,自动生成枚举代码。这属于额外的构建步骤,不是TypeScript原生支持的能力。

总结:TypeScript原生不支持从编译时类型直接生成运行时枚举,但通过共享数据源、代码生成等方式,能间接实现类似效果。

内容的提问来源于stack exchange,提问作者Mehul Chaturvedi

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.11 13:20:51