【问题标题】:Create a TypeScript (string) enum from a union type?从联合类型创建一个 TypeScript(字符串)枚举?
【发布时间】:2019-10-14 12:00:01
【问题描述】:

如果我有这样的 TypeScript 联合:

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

有没有办法可以将其转换为基于字符串的枚举?像下面这样:

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

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

【问题讨论】:

  • 但是字符串文字类型已经提供了智能感知。如果您在预期字符串文字的位置键入“”,您将获得关于可能值的智能感知......

标签: typescript enums


【解决方案1】:

就像我在 cmets 字符串文字类型中指出的那样,已经提供了很好的智能感知支持,所以我个人只会使用这些,而不会费心创建其他任何东西,开发人员的体验已经很棒了。

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

您不能创建枚举,但可以使用映射类型创建具有联合的所有属性并且每个属性与键具有相同值的对象。您将需要手动维护这些对象,但如果它们不同步,typescript 会发出警告,因此维护它们应该不是问题。

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;

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

【讨论】:

  • 联合类型很好,但我正在考虑制作一个枚举,主要目的是在需要重命名字符串的情况下实现可维护性。我可能会在代码库的多个位置使用字符串文字“apple”,但使用枚举为我提供了一种简单的方法来重命名事物,而全局字符串查找和替换将失败。
  • @mxiong 枚举肯定有其优势。虽然重命名可能不起作用,但在使用旧版本字符串的任何地方都会出现错误
猜你喜欢
  • 2018-02-14
  • 2019-10-28
  • 1970-01-01
  • 2018-05-26
  • 2023-01-14
  • 2019-02-22
  • 1970-01-01
  • 2018-10-18
  • 2019-12-01
相关资源
最近更新 更多