如何将提取的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
相关产品推荐
相关产品推荐

