Проверьте, существует ли значение в перечислении в TypeScript

Я получаю число type = 3 и должен проверить, существует ли он в этом перечислении:

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

Лучший способ, которым я нашел, - получить все значения Enum в виде массива и использовать indexOf. Но полученный код не очень читаем:

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

Есть ли более простой способ сделать это?

Ответ 1

Если вы хотите, чтобы это работало с перечислениями строк, вам нужно использовать Object.values(ENUM).includes(ENUM.value), потому что перечисления строк не отображаются обратными, согласно https://www.typescriptlang.org/docs/handbook/release-notes/typescript-2-4.html:

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

становится:

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

Итак, вам просто нужно сделать:

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

Ответ 2

Если вы используете TypeScript, вы можете использовать фактическое перечисление. Затем вы можете проверить его, используя in:

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

var type = 3;

if (type in MESSAGE_TYPE) {

}

Это работает, потому что, когда вы скомпилируете приведенное выше перечисление, он генерирует следующий объект:

{
    '1': 'INFO',
    '2': 'SUCCESS',
    '3': 'WARNING',
    '4': 'ERROR',
    INFO: 1,
    SUCCESS: 2,
    WARNING: 3,
    ERROR: 4
}