string枚举的反向映射

我想在打字稿中使用string枚举,但是我看不到支持反转映射。 我有这样的枚举:

enum Mode { Silent = "Silent", Normal = "Normal", Deleted = "Deleted" } 

我需要像这样使用它:

 let modeStr: string; let mode: Mode = Mode[modeStr]; 

是的,我不知道它在modeStrstring中有什么,我需要它parsing为枚举或在运行时parsing失败,如果该string没有出现在枚举定义。 我怎样才能做到这一点,因为它可以是? 提前致谢

我们可以使Mode成为同一types的一个types和一个值。

 type Mode = string; let Mode = { Silent: "Silent", Normal: "Normal", Deleted: "Deleted" } let modeStr: string = "Silent"; let mode: Mode; mode = Mode[modeStr]; // Silent mode = Mode.Normal; // Normal mode = "Deleted"; // Deleted mode = Mode["unknown"]; // undefined mode = "invalid"; // "invalid" 

更严格的版本:

 type Mode = "Silent" | "Normal" | "Deleted"; const Mode = { get Silent(): Mode { return "Silent"; }, get Normal(): Mode { return "Normal"; }, get Deleted(): Mode { return "Deleted"; } } let modeStr: string = "Silent"; let mode: Mode; mode = Mode[modeStr]; // Silent mode = Mode.Normal; // Normal mode = "Deleted"; // Deleted mode = Mode["unknown"]; // undefined //mode = "invalid"; // Error 

string枚举这个答案 :

 enum Mode { Silent = <any>"Silent", Normal = <any>"Normal", Deleted = <any>"Deleted" } let modeStr: string = "Silent"; let mode: Mode; mode = Mode[modeStr]; // Silent mode = Mode.Normal; // Normal //mode = "Deleted"; // Error mode = Mode["unknown"]; // undefined 

如果你使用代理可以,我做了一个更通用和紧凑的版本:

stringEnum.ts

 export type StringEnum<T extends string> = {[K in T]: K} const proxy = new Proxy({}, { get(target, property) { return property; } }) export default function stringEnum<T extends string>(): StringEnum<T> { return proxy as StringEnum<T>; } 

用法:

 import stringEnum from './stringEnum'; type Mode = "Silent" | "Normal" | "Deleted"; const Mode = stringEnum<Mode>();