Otrzymuję numer type = 3
i muszę sprawdzić, czy istnieje w tym wyliczeniu:
export const MESSAGE_TYPE = {
INFO: 1,
SUCCESS: 2,
WARNING: 3,
ERROR: 4,
};
Najlepszym sposobem, jaki znalazłem, jest pobranie wszystkich wartości wyliczenia jako tablicy i użycie na niej indexOf. Ale wynikowy kod nie jest zbyt czytelny:
if( -1 < _.values( MESSAGE_TYPE ).indexOf( _.toInteger( type ) ) ) {
// do stuff ...
}
Czy istnieje prostszy sposób na zrobienie tego?
javascript
typescript
enums
Tim Schoch
źródło
źródło
if(Object.values(MESSAGE_TYPE).includes(+type)
? Niewiele możesz zrobić.!!MESSAGE_TYPE[type]
sprawdzić, czy istnieje wartość.MESSAGE_TYPE[type]
zwróci wartość undefined, jeśli wartośćtype
nie istnieje w dniuMESSAGE_TYPE
0
.MESSAGE_TYPE[type] !== undefined
Odpowiedzi:
Jeśli chcesz, aby to działało z wyliczeniami ciągów, musisz użyć,
Object.values(ENUM).includes(ENUM.value)
ponieważ wyliczenia ciągów nie są odwrotnie mapowane, zgodnie z https://www.typescriptlang.org/docs/handbook/release-notes/typescript-2-4.html :staje się:
Musisz więc tylko:
Jeśli pojawi się błąd dotyczący
Property 'values' does not exist on type 'ObjectConstructor'
:, oznacza to, że nie kierujesz się na ES2017. Możesz użyć tej konfiguracji tsconfig.json:Lub możesz po prostu wykonać dowolną obsadę:
źródło
Property 'values' does not exist on type 'ObjectConstructor'
.(<any>Object).values(Vehicle).includes(Vehicle.car)
(Object.values(Vehicle).includes(Vehicle.car))
zawsze będzie prawdziwe, ale pytanie brzmi, jak sprawdzić, czy dana wartość jest uwzględniona w wyliczeniu, na przykład(Object.values(Vehicle).includes('car'))
powinna zwracać,true
ale(Object.values(Vehicle).includes('plane'))
powinna zwracać fałsz.Jeśli używasz TypeScript, możesz użyć rzeczywistego wyliczenia . Następnie możesz to sprawdzić za pomocą
in
.Działa to tylko wtedy, gdy wyliczenie jest oparte na liczbach i nie jest oznaczone
const
:Działa to, ponieważ kiedy kompilujesz powyższe wyliczenie, generuje on poniższy obiekt:
źródło
export const MESSAGE_TYPE = { ... }
MESSAGE_TYPE
Zgodnie z sugestią zmieniliśmy na rzeczywiste wyliczenie i teraz Twoje rozwiązanie działa jak urok. Dzięki @SaravanaTypeScript v3.7.3
źródło
Na Twoje pytanie jest bardzo proste i łatwe rozwiązanie:
źródło
Wynik różnicy w logu:
Rozwiązanie, musimy usunąć klucz jako liczbę.
Stosowanie
źródło