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

是否从联合类型创建TypeScript(字符串)枚举?,typescript,enums,Typescript,Enums,如果我有这样一个TypeScript联合体: type SomeUnion = 'Foo' | 'Bar' | 'Baz'; 有没有办法将其转换为基于字符串的枚举?例如: enum SomeUnionBasedEnum { Foo = 'Foo', Bar = 'Bar', Baz = 'Baz' } 我试图对表示系统中权限的枚举进行建模,但在某些情况下,这些权限是自动生成的联合类型。我想要一种将它们组合到单个枚举中的方法,因为枚举通过将intellisense限制在允许的值来提

如果我有这样一个TypeScript联合体:

type SomeUnion = 'Foo' | 'Bar' | 'Baz';
有没有办法将其转换为基于字符串的枚举?例如:

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

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

正如我在评论中指出的,字符串文字类型已经提供了很好的IntelisSense支持,因此我个人只需使用这些类型,而不必费心创建任何其他内容,开发人员的体验已经很好了。

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

不能创建枚举,但可以使用映射类型创建具有联合的所有属性且每个属性与键具有相同值的对象。您需要手动维护这些对象,但如果它们不同步,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;
键入SomeUnion='Foo'|'Bar'|'Baz';
函数createEnumObject(o:{[P in T]:P}){
返回o;
}
const SomeUnion=createEnumObject({
福:“福”,
酒吧:“酒吧”,
巴兹:“巴兹”
})
设o:SomeUnion=SomeUnion.Bar;

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

但是字符串文字类型已经提供了intelisense。如果您在需要字符串文字的位置键入“”,您将获得有关可能值的IntelSense…Union类型很好,但我正在考虑创建一个枚举,主要目的是在需要重命名字符串的情况下实现可维护性。我可能会在代码库中的多个位置使用字符串文字“apple”,但使用枚举给我提供了一种简单的方法来重命名内容,这样全局字符串查找和替换就会失败。@mxiong枚举肯定有它们的优点。虽然重命名可能不起作用,但在使用旧版本字符串的任何地方都会出现错误