Compruebe si el valor existe en enumeración en TypeScript
Recibo un número type = 3
y 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?
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
}
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
}
Según Sandersn la mejor forma de hacerlo sería:
Object.values(MESSAGE_TYPE).includes(type as MESSAGE_TYPE)
export enum YourEnum {
enum1 = 'enum1',
enum2 = 'enum2',
enum3 = 'enum3',
}
const status = 'enumnumnum';
if (!Object.values(YourEnum)?.includes(status)) {
throw new UnprocessableEntityResponse('Invalid enum val');
}
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;
}