web-dev-qa-db-fra.com

Vérifier si la valeur existe dans enum dans TypeScript

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?

87
Tim Schoch

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
}
103
Xiv

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
}
96
Saravana

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;
}
9
Ester Kaufman
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
}
2
Nhan Cao