如果我有一个像这样的TypeScript联盟:
type SomeUnion = 'Foo' | 'Bar' | 'Baz';有办法把它转换成基于字符串的枚举吗?如下所示:
enum SomeUnionBasedEnum {
Foo = 'Foo',
Bar = 'Bar',
Baz = 'Baz'
}我试图建模一个表示系统中权限的枚举,但在某些情况下,这些权限是自动生成的联合类型。我想要一种将它们合并成单个枚举的方法,因为枚举通过将intellisense限制在允许的值来提供更好的开发体验。例如,AppPermisionEnum.<available enum values>。我也愿意接受将枚举合并成单个枚举的方法,但我认为这是不可能的。我的最终目标是拥有一个由来自几个不同来源的值组成的枚举。
发布于 2019-05-28 23:05:11
正如我在注释字符串文本类型中所指出的那样,已经提供了良好的智能支持,所以我个人只想使用这些,而不需要再创建任何东西,开发人员的体验已经很棒了。
下面的代码是一个寻找问题的解决方案,但是我们可以做一些接近你想要的事情。
您不能创建枚举,但是可以使用映射的类型创建一个具有所有联合属性的对象,并且每个属性具有与键相同的值。您将需要手动维护这些对象,但是如果这些对象不同步,类型记录将发出警告,因此维护它们不应该是一个问题。
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;在没有额外代码的情况下,将一个联合(即类型)转换为一个对象(即值)原则上是不可能的,类型在编译时被擦除,所以在运行时不能依赖于任何东西,并且类型抄本对类型定向发射有严格的策略。
https://stackoverflow.com/questions/56350979
复制相似问题