javascript - Tarkista, onko arvo olemassa enumissa TypeScriptissä


Saan numeron type=3 ja minun täytyy tarkistaa, onko se olemassa tässä enumissa:

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

Paras tapa, jonka löysin, on saada kaikki Enum-arvot taulukoksi ja käyttää indexOf-metodia siihen. Mutta tuloksena oleva koodi ei ole kovin luettavaa:

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

Onko tähän yksinkertaisempaa tapaa?

Vastaus #1

Jos haluat tämän toimivan merkkijono-enumeiden kanssa, sinun täytyy käyttää Object.values(ENUM).includes(ENUM.value), koska merkkijono-enumit eivät ole käänteisiä, lähteenä https://www.typescriptlang.org/docs/handbook/release-notes/typescript-2-4.html#string-enums:

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

tulee :

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

Joten sinun tarvitsee vain tehdä:

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

Jos saat virheen: Property 'values' does not exist on type 'ObjectConstructor', et kohdistu ES2017:ään. Voit joko käyttää tätä tsconfig.json -asetusta:

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

Tai voit vain tehdä minkä tahansa tyyppimuunnoksen:

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

Vastaus #2

Tämä toimii vain ei-const, numeroihin perustuvien enumien kanssa. Const-enumeille tai muiden tyyppien enumeille katso tämä vastaus


Jos käytät TypeScriptiä, voit käyttää todellista enumia. Sitten voit tarkistaa sen käyttämällä in.

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

var type = 3;

if (type in MESSAGE_TYPE) {

}

Tämä toimii, koska kun käännät yllä olevan enum-arvon, se luo alla olevan objektin:

{
    '1': 'INFO',
    '2': 'SUCCESS',
    '3': 'WARNING',
    '4': 'ERROR',
    INFO: 1,
    SUCCESS: 2,
    WARNING: 3,
    ERROR: 4
}

Vastaus #3

Sandersn mukaan paras tapa tehdä tämä olisi:

Object.values(MESSAGE_TYPE).includes(type as MESSAGE_TYPE)

Vastaus #4

export enum YourEnum {
   enum1 = 'enum1',
   enum2 = 'enum2',
   enum3 = 'enum3',
}

const status = 'enumnumnum';

if (!Object.values(YourEnum)?.includes(status)) {
     throw new UnprocessableEntityResponse('Invalid enum val');
}

Vastaus #5

Kysymykseesi on erittäin yksinkertainen ja helppo ratkaisu:

var districtId = 210;

if (DistrictsEnum[districtId] != null) {

// Returns 'undefined' if the districtId not exists in the DistrictsEnum 
    model.handlingDistrictId = districtId;
}

Vastaus #6

Tyypin määrittäminen on väistämätöntä. Seuranta

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

Löysin yhden vaihtoehdon, jota ei mainittu, joten ajattelin jakaa korjaukseni siihen:

const someString: Vehicle | string = 'car';
const inEnum = (Object.values(Vehicle) as string[]).includes(someString);

Pidän tätä totuudenmukaisempana, koska yleensä tulemme tyypiltämme turvallisina (merkkijonon kanssa) ja haluamme verrata sitä enumiin; olisi hieman uhkarohkeaa tyyppimuuntaa se any-tyyppiin (syy: älä koskaan tee tätä) tai Vehicle-tyyppiin (syy: todennäköisesti epätotuudenmukainen). Sen sijaan Object.values()-tuloksen tyyppimuuntaminen merkkijonotaulukoksi on itse asiassa hyvin todellista.

Vastaus #7

export enum UserLevel {
  Staff = 0,
  Leader,
  Manager,
}

export enum Gender {
  None = "none",
  Male = "male",
  Female = "female",
}

Erotuksen tulos lokissa:

log(Object.keys(Gender))
=>
[ 'None', 'Male', 'Female' ]

log(Object.keys(UserLevel))
=>
[ '0', '1', '2', 'Staff', 'Leader', 'Manager' ]

Ratkaisu, meidän on poistettava avain numerona.

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;
  }
}

Käyttö

// 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
}

Aiheeseen liittyviä artikkeleita