【问题标题】:Convert enum type back to enum将枚举类型转换回枚举
【发布时间】:2023-02-21 23:10:03
【问题描述】:

我正在使用一个具有如下枚举的库

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

它没有被导出,而是在另一个类类型中使用,如下所示

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

现在我自己的代码需要那个枚举,但我不能直接使用它,因为它没有直接导出。所以我尝试了类似下面的方法来提取类型

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

在以下情况下有效

const val:TestEnumType = TestEnum.FIRST;

但是因为我不能直接访问TestEnum,所以我不能使用TestEnum.FIRST并且必须使用我提取的类型

const val2:TestEnumType = TestEnumType.FIRST;

但它不起作用,因为 TestEnumType 是一种类型,而不是枚举本身。这是我在 IDE 上收到的错误。

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

知道我是否可以通过某种 TS 魔法以某种方式使用 TestEnumType.FIRST 吗?

【问题讨论】:

  • 你用的是什么图书馆?

标签: javascript typescript enums typescript-types


【解决方案1】:

不幸的是,不可能使用TestEnumType.FIRST 来引用枚举值FIRST,因为TestEnumType 只是一种类型,而不是运行时对象。

即使未导出枚举,如果您知道它的名称并且可以访问定义它的模块,您仍然可以直接使用它。例如,如果枚举是在名为“mymodule”的模块中定义的,则可以像这样导入它:

import { TestEnum } from 'mymodule';

使用枚举值创建一个新对象 如果不能直接使用枚举,可以创建一个与枚举具有相同值的新对象:

const TestEnumType = { FIRST: 0, SECOND: 100, THIRD: 200, FOURTH: 300, } as const;

请注意最后的 as const 断言,它确保值被视为常量而不是可变属性。您现在可以使用 TestEnumType.FIRST 来引用值 0。

创建映射到枚举值的自定义类型

type TestEnumType = { FIRST: 0, SECOND: 100, THIRD: 200, FOURTH: 300, };

然后你可以使用TestEnumType['FIRST']来引用值0。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2010-12-21
    • 2010-10-11
    • 1970-01-01
    • 2020-08-21
    • 2021-01-04
    • 2018-02-14
    相关资源
    最近更新 更多