Recibo un 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 Enum como una matriz y usar indexOf en él. Pero el código resultante no es muy legible:
if( -1 < _.values( MESSAGE_TYPE ).indexOf( _.toInteger( type ) ) ) { // do stuff ... }¿Hay una forma más sencilla de hacer esto?
Si desea que esto funcione con enumeraciones de cadenas, debe usar Object.values(ENUM).includes(ENUM.value) porque las enumeraciones de cadenas no se asignan de forma inversa, de acuerdo con https://www.typescriptlang.org/docs/handbook /notas-de-lanzamiento/typescript-2-4.html :
enum Vehicle { Car = 'car', Bike = 'bike', Truck = 'truck' }se convierte en:
{ Car: 'car', Bike: 'bike', Truck: 'truck' }Así que solo tienes que hacer:
if (Object.values(Vehicle).includes('car')) { // Do stuff here } Si obtiene un error para: Property 'values' does not exist on type 'ObjectConstructor' , entonces no está apuntando a ES2017. Puede usar esta configuración tsconfig.json:
"compilerOptions": { "lib": ["es2017"] }O simplemente puedes hacer cualquier lanzamiento:
if ((<any>Object).values(Vehicle).includes('car')) { // Do stuff here }Esto funciona solo en enumeraciones basadas en números que no son constantes. Para enumeraciones constantes o enumeraciones de otros tipos, consulte esta respuesta anterior
Si usa TypeScript, puede usar una enumeración real . Luego puede verificarlo 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 manera de hacer esto sería:
Object.values(MESSAGE_TYPE).includes(type as MESSAGE_TYPE)