你有两个选择。
第一个,你可以修改你的enum。
enum MyEnum {
Unknown = 1,
SomeValue,
SomeOtherValue,
}
const myIntValue = 1;
const myEnumValue = MyEnum[myIntValue]; // string
如果您从MyEnum 定义中删除1,它将从0 开始。
我个人不喜欢这个解决方案,因为numerical enum 不是最佳选择。
考虑这个例子:
const foo = (en: MyEnum) => 42
foo(99999) // ok
第二个选项。
您可以使用元组将整数映射到枚举:
const enum MyEnum {
Unknown = 'Unknown',
SomeValue = 'SomeValue',
SomeOtherValue = 'SomeOtherValue',
}
const MapEnum = [MyEnum.Unknown, MyEnum.SomeValue, MyEnum.SomeOtherValue] as const;
const result = MapEnum[1] // MyEnum.SomeValue
请记住,enum/object 键是无序的,因此动态创建这样的元组是不安全的。
更新
第二个选项有效,虽然它更容易出错...
enum MyEnum {
Unknown = 'Unknown',
SomeValue = 'SomeValue',
SomeOtherValue = 'SomeOtherValue',
}
type TupleUnion<U extends string, R extends any[] = []> = {
[S in U]: Exclude<U, S> extends never ? [...R, S] : TupleUnion<Exclude<U, S>, [...R, S]>;
}[U];
const MapEnum: TupleUnion<MyEnum> = [MyEnum.Unknown, MyEnum.SomeValue, MyEnum.SomeOtherValue,];
你不会忘记一些价值
没有排列的替代方式:
enum MyEnum {
Unknown = 'Unknown',
SomeValue = 'SomeValue',
SomeOtherValue = 'SomeOtherValue',
}
// credits goes to https://stackoverflow.com/a/50375286
type UnionToIntersection<U> = (U extends any ? (k: U) => void : never) extends (
k: infer I
) => void
? I
: never;
// Credits goes to https://github.com/microsoft/TypeScript/issues/13298#issuecomment-468114901
type UnionToOvlds<U> = UnionToIntersection<
U extends any ? (f: U) => void : never
>;
type PopUnion<U> = UnionToOvlds<U> extends (a: infer A) => void ? A : never;
type IsUnion<T> = [T] extends [UnionToIntersection<T>] ? false : true;
type UnionToArray<T, A extends unknown[] = []> = IsUnion<T> extends true
? UnionToArray<Exclude<T, PopUnion<T>>, [PopUnion<T>, ...A]>
: [T, ...A];
type Result = UnionToArray<MyEnum>
const MapEnum: UnionToArray<MyEnum> = [MyEnum.Unknown, MyEnum.SomeValue, MyEnum.SomeOtherValue,];
您可以在我的blog 中找到更多示例