javascriptnode.jstypescriptvisual-studio-codemsdn

Reverse-Mapping for String Enums


I wanted to use string enums in typescript but I can't see a support for reversed mapping in it. I have an enum like this:

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

and I need to use it like this:

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

and yes I don't know what is it there in modeStr string and I need it parsed to the enum or a fail at parsing in runtime if the string is not presented in the enum definition. How can I do that as neat as it can be? thanks in advance


Solution

  • We can make the Mode to be a type and a value at the same type.

    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"
    

    A more strict version:

    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 as this answer:

    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