如果我有一个像这样的 TypeScript 联合:
type SomeUnion = 'Foo' | 'Bar' | 'Baz';
Run Code Online (Sandbox Code Playgroud)
有没有办法可以将其转换为基于字符串的枚举?就像下面这样:
enum SomeUnionBasedEnum {
Foo = 'Foo',
Bar = 'Bar',
Baz = 'Baz'
}
Run Code Online (Sandbox Code Playgroud)
我正在尝试对代表我们系统中的权限的枚举进行建模,但这些权限在某些情况下是自动生成的联合类型。我想要一种将它们组合成一个枚举的方法,因为枚举通过将智能感知限制在允许的值来提供更好的开发人员体验。例如AppPermisionEnum.<available enum values>。我也愿意接受将枚举组合成单个枚举的方法,但我认为这是不可能的。我的最终目标是拥有一个由来自几个不同来源的值组成的枚举。
就像我在评论中指出的那样,字符串文字类型已经提供了良好的智能感知支持,因此我个人只会使用它们,而不必费心创建其他任何内容,开发人员体验已经很棒了。
下面的代码是寻找问题的解决方案,但我们可以做一些接近您想要的事情。
您无法创建枚举,但可以使用映射类型创建一个具有联合的所有属性的对象,并且每个属性都具有与键相同的值。您需要手动维护这些对象,但如果它们不同步,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;
Run Code Online (Sandbox Code Playgroud)
在没有额外代码的情况下将联合(即类型)转换为对象(即值)原则上是不可能的,类型在编译时被删除,因此在运行时不能依赖任何东西,并且打字稿有严格的政策反对类型定向发射。
| 归档时间: |
|
| 查看次数: |
5139 次 |
| 最近记录: |