首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >从联合类型创建TypeScript (字符串)枚举?

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

Stack Overflow用户
提问于 2019-05-28 22:47:51
回答 1查看 2.6K关注 0票数 6

如果我有一个像这样的TypeScript联盟:

代码语言:javascript
复制
type SomeUnion = 'Foo' | 'Bar' | 'Baz';

有办法把它转换成基于字符串的枚举吗?如下所示:

代码语言:javascript
复制
enum SomeUnionBasedEnum {
  Foo = 'Foo',
  Bar = 'Bar',
  Baz = 'Baz'
}

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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-05-28 23:05:11

正如我在注释字符串文本类型中所指出的那样,已经提供了良好的智能支持,所以我个人只想使用这些,而不需要再创建任何东西,开发人员的体验已经很棒了。

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

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

代码语言:javascript
复制
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;

在没有额外代码的情况下,将一个联合(即类型)转换为一个对象(即值)原则上是不可能的,类型在编译时被擦除,所以在运行时不能依赖于任何东西,并且类型抄本对类型定向发射有严格的策略。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56350979

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档