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

如何将提取的TypeScript枚举类型转为可使用的枚举值?

从未导出枚举中获取可用的枚举值与类型

问题场景

你使用的库中存在一个未导出的枚举,且该枚举被用于类属性的类型定义:

enum TestEnum {
  FIRST = 0,
  SECOND = 100,
  THIRD = 200,
  FOURTH = 300,
}

declare class TestClass {
  testEnumProp: TestEnum | string | null;
}

你已经通过类型提取得到了枚举的类型:

type TestEnumType = Exclude<NonNullable<TestClass['testEnumProp']>, string>;

但无法像使用普通枚举那样,通过TestEnumType.FIRST获取枚举值,会触发TypeScript错误:

'TestEnumType' only refers to a type, but is being used as a value here.ts(2693)

解决技巧

技巧1:手动复刻枚举值对象

既然已经明确原枚举的键和对应值(可通过类型提示或库的声明文件确认),直接创建一个与原枚举结构完全一致的对象,并关联提取出的类型:

type TestEnumType = Exclude<NonNullable<TestClass['testEnumProp']>, string>;

const TestEnumValues: Record<keyof typeof TestEnum, TestEnumType> = {
  FIRST: 0,
  SECOND: 100,
  THIRD: 200,
  FOURTH: 300,
};

之后就可以通过TestEnumValues.FIRST获取枚举值,且类型与原枚举完全匹配。

技巧2:利用类型约束自动生成枚举值对象(适用于数值枚举)

如果是数值枚举,可以通过类型约束确保输入的值符合原枚举类型,再构建值对象:

type TestEnumType = Exclude<NonNullable<TestClass['testEnumProp']>, string>;

// 定义约束函数,仅接受TestEnumType类型的值
const createEnumValue = <T extends TestEnumType>(value: T) => value;

// 创建枚举值对象
const TestEnumValues = {
  FIRST: createEnumValue(0),
  SECOND: createEnumValue(100),
  THIRD: createEnumValue(200),
  FOURTH: createEnumValue(300),
};

这种方式能避免手动输入数值时出现错误,确保值的合法性。

注意事项

  • 由于原枚举未导出,无法直接获取它的运行时对象,必须手动复刻或通过类型约束生成对应的值对象。
  • 若原枚举后续有版本更新,需要同步更新自己定义的TestEnumValues,否则会出现类型或值不匹配的问题。

内容的提问来源于stack exchange,提问作者0xC0DED00D

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.03 15:25:27