从联合类型创建TypeScript(字符串)枚举?

时间:2019-05-28 22:47:51

标签: typescript enums

如果我有这样的TypeScript联合:

type SomeUnion = 'Foo' | 'Bar' | 'Baz';

是否可以将其转换为基于字符串的枚举?如下所示:

enum SomeUnionBasedEnum {
  Foo = 'Foo',
  Bar = 'Bar',
  Baz = 'Baz'
}

我正在尝试对表示我们系统中权限的枚举建模,但是在某些情况下,这些权限是自动生成的并集类型。我想要一种将它们组合成单个枚举的方法,因为枚举通过将智能感知限制为允许的值来提供更好的开发人员体验。例如AppPermisionEnum.<available enum values>。我也乐于将枚举合并为单个枚举,但是我认为这是不可能的。我的最终目标是让一个枚举包含几个不同来源的值。

1 个答案:

答案 0 :(得分:1)

就像我在注释字符串中指出的那样,文字类型已经提供了良好的智能支持,因此我个人将只使用它们而不必费心创建其他任何东西,开发人员的经验已经很棒。

下面的代码是解决问题的解决方案,但是我们可以做一些您想要的事情。

您无法创建枚举,但是可以使用映射类型创建具有并集的所有属性且每个属性与键具有相同值的对象。您将需要手动维护这些对象,但是打字稿将在它们不同步时发出警告,因此维护它们应该不是问题。

type SomeUnion = 'Foo' | 'Bar' | 'Baz';

function createEnumObject<T extends string>(o: { [P in T]: P }) {
    return o;
}

const SomeUnion = createEnumObject<SomeUnion>({
    Foo: "Foo",
    Bar: "Bar",
    Baz: "Baz"
})

let o: SomeUnion = SomeUnion.Bar;

原则上不可能在没有额外代码的情况下将联合(即类型)转换为对象(即值),在编译时将类型擦除,因此在运行时不能依赖任何内容,而打字稿具有严格禁止类型定向发射的政策。