Je reçois un numéro type = 3
et je dois vérifier s'il existe dans cet enum:
export const MESSAGE_TYPE = {
INFO: 1,
SUCCESS: 2,
WARNING: 3,
ERROR: 4,
};
Le meilleur moyen que j'ai trouvé est d'obtenir toutes les valeurs Enum sous forme de tableau et d'utiliser indexOf dessus. Mais le code résultant n'est pas très lisible:
if( -1 < _.values( MESSAGE_TYPE ).indexOf( _.toInteger( type ) ) ) {
// do stuff ...
}
Y a-t-il un moyen plus simple de faire cela?
Si vous voulez que cela fonctionne avec des énumérations de chaîne, vous devez utiliser Object.values(ENUM).includes(ENUM.value)
car les énumérations de chaîne ne sont pas inversées, selon https://www.typescriptlang.org/docs/handbook/release-notes /TypeScript-2-4.html :
Enum Vehicle {
Car = 'car',
Bike = 'bike',
Truck = 'truck'
}
devient:
{
Car: 'car',
Bike: 'bike',
Truck: 'truck'
}
Il suffit donc de faire:
if (Object.values(Vehicle).includes(Vehicle.car)) {
// Do stuff here
}
Si vous obtenez une erreur pour: Property 'values' does not exist on type 'ObjectConstructor'
, vous ne ciblez pas ES2017. Vous pouvez soit utiliser cette configuration tsconfig.json:
"compilerOptions": {
"lib": ["es2017"]
}
Ou vous pouvez simplement faire un casting quelconque:
if ((<any>Object).values(Vehicle).includes(Vehicle.car)) {
// Do stuff here
}
Si vous utilisez TypeScript, vous pouvez utiliser un enum réel . Ensuite, vous pouvez le vérifier avec in
. Notez que cela ne fonctionne que si votre enum n'est pas const
et est basé sur un nombre:
export enum MESSAGE_TYPE {
INFO = 1,
SUCCESS = 2,
WARNING = 3,
ERROR = 4,
};
var type = 3;
if (type in MESSAGE_TYPE) {
}
Cela fonctionne car lorsque vous compilez l'énumération ci-dessus, il génère l'objet ci-dessous:
{
'1': 'INFO',
'2': 'SUCCESS',
'3': 'WARNING',
'4': 'ERROR',
INFO: 1,
SUCCESS: 2,
WARNING: 3,
ERROR: 4
}
Il existe une solution très simple et facile à votre question:
var districtId = 210;
if (DistrictsEnum[districtId] != null) {
// Returns 'undefined' if the districtId not exists in the DistrictsEnum
model.handlingDistrictId = districtId;
}
export enum UserLevel {
Staff = 0,
Leader,
Manager,
}
export enum Gender {
None = "none",
Male = "male",
Female = "female",
}
Résultat de la différence dans le journal:
log(Object.keys(Gender))
=>
[ 'None', 'Male', 'Female' ]
log(Object.keys(UserLevel))
=>
[ '0', '1', '2', 'Staff', 'Leader', 'Manager' ]
La solution, nous devons supprimer la clé sous forme de numéro.
export class Util {
static existValueInEnum(type: any, value: any): boolean {
return Object.keys(type).filter(k => isNaN(Number(k))).filter(k => type[k] === value).length > 0;
}
}
Usage
// For string value
if (!Util.existValueInEnum(Gender, "XYZ")) {
//todo
}
//For number value, remember cast to Number using Number(val)
if (!Util.existValueInEnum(UserLevel, 0)) {
//todo
}