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
}
