Compruebe si el valor existe en enumeración en TypeScript

Resuelto Tim Schoch asked hace 7 años • 12 respuestas

Recibo un número type = 3y tengo que verificar si existe en esta enumeración:

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

La mejor manera que encontré es obtener todos los valores de enumeración como una matriz y usar indexOf en ellos. Pero el código resultante no es muy legible:

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

¿Existe una forma más sencilla de hacer esto?

Tim Schoch avatar May 05 '17 19:05 Tim Schoch
Aceptado

Si desea que esto funcione con enumeraciones de cadenas, debe usarlo Object.values(ENUM).includes(ENUM.value)porque las enumeraciones de cadenas no están asignadas de manera inversa, de acuerdo con https://www.typescriptlang.org/docs/handbook/release-notes/typescript-2-4.html :

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

se convierte en:

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

Entonces solo necesitas hacer:

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

Si recibe un error para:, Property 'values' does not exist on type 'ObjectConstructor'entonces no está apuntando a ES2017. Puedes usar esta configuración tsconfig.json:

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

O simplemente puedes hacer cualquier reparto:

if ((<any>Object).values(Vehicle).includes('car')) {
    // Do stuff here
}
Xiv avatar Dec 11 '2017 14:12 Xiv

Esto solo funciona en enumeraciones basadas en números y no constantes. Para enumeraciones constantes o enumeraciones de otros tipos, consulte esta respuesta


Si está utilizando TypeScript, puede utilizar una enumeración real . Luego puedes comprobarlo usando in.

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

var type = 3;

if (type in MESSAGE_TYPE) {

}

Esto funciona porque cuando compila la enumeración anterior, genera el siguiente objeto:

{
    '1': 'INFO',
    '2': 'SUCCESS',
    '3': 'WARNING',
    '4': 'ERROR',
    INFO: 1,
    SUCCESS: 2,
    WARNING: 3,
    ERROR: 4
}
Saravana avatar May 05 '2017 12:05 Saravana

Según Sandersn la mejor forma de hacerlo sería:

Object.values(MESSAGE_TYPE).includes(type as MESSAGE_TYPE)
vinczemarton avatar Sep 28 '2020 19:09 vinczemarton
export enum YourEnum {
   enum1 = 'enum1',
   enum2 = 'enum2',
   enum3 = 'enum3',
}

const status = 'enumnumnum';

if (!Object.values(YourEnum)?.includes(status)) {
     throw new UnprocessableEntityResponse('Invalid enum val');
}
Jayson San Agustin avatar Jan 22 '2020 08:01 Jayson San Agustin

Hay una solución muy sencilla y fácil a tu pregunta:

var districtId = 210;

if (DistrictsEnum[districtId] != null) {

// Returns 'undefined' if the districtId not exists in the DistrictsEnum 
    model.handlingDistrictId = districtId;
}
Ester Kaufman avatar Mar 20 '2019 10:03 Ester Kaufman