Search code examples
javascripttypescriptenums

Check if value exists in enum in TypeScript


I receive a number type = 3 and have to check if it exists in this enum:

export const MESSAGE_TYPE = {
    INFO: 1,
    SUCCESS: 2,
    WARNING: 3,
    ERROR: 4,
};

The best way I found is by getting all Enum Values as an array and using indexOf on it. But the resulting code isn't very legible:

if( -1 < _.values( MESSAGE_TYPE ).indexOf( _.toInteger( type ) ) ) {
    // do stuff ...
}

Is there a simpler way of doing this?


Solution

  • If you want this to work with string enums, you need to use Object.values(ENUM).includes(ENUM.value) because string enums are not reverse mapped, according to https://www.typescriptlang.org/docs/handbook/release-notes/typescript-2-4.html#string-enums:

    enum Vehicle {
        Car = 'car',
        Bike = 'bike',
        Truck = 'truck'
    }
    

    becomes:

    {
        Car: 'car',
        Bike: 'bike',
        Truck: 'truck'
    }
    

    So you just need to do:

    if (Object.values(Vehicle).includes('car')) {
        // Do stuff here
    }
    

    If you get an error for: Property 'values' does not exist on type 'ObjectConstructor', then you are not targeting ES2017. You can either use this tsconfig.json config:

    "compilerOptions": {
        "lib": ["es2017"]
    }
    

    Or you can just do an any cast:

    if ((<any>Object).values(Vehicle).includes('car')) {
        // Do stuff here
    }