Tellesenum i TypeScript tillater hvilket som helst tall, mens strengenum ikke gjør det
Si at jeg har en numerisk enum:
const enum EStatus {
Busy = 0,
Available = 1,
Away = 2
}
TypeScript vil ikke klage når jeg gjør følgende:
const status: EStatus = 4
Men hvis jeg har en strengenum:
const enum EDayOfWeekend {
Saturday = "Saturday",
Sunday = "Sunday"
}
Da vil TypeScript klage når jeg prøver å gjøre følgende:
const dayOfWeekend: EDayOfWeekend = "Tuesday"
Jeg ville ha forventet at TypeScript var konsekvent med enten å tillate begge, eller ikke tillate noen av dem. Etter min mening bør det ikke tillate at noe annet enn de definerte verdiene brukes, eller enda bedre håndheve at du kun kan bruke selve enumen for å initialisere variabler, for eksempel.
const dayOfWeekend = EDayOfWeekend.Saturday
Jeg ville være interessert i å vite hvorfor denne inkonsekvensen eksisterer i TypeScript og om den er der med vilje.
Svar #1
Hovedårsaken til forskjellen i oppførsel er evnen til å ha flaggnummerenummer og bruke bitvise operatorer på dem. For streng-enum finnes det ingen tilsvarende funksjon. I denne GitHub-issuen gjør Daniel Rosenwasser kompilator-teamets begrunnelse klar:
Atferden er motivert av bitvise operasjoner. Det er tider når SomeFlag.Foo | SomeFlag.Bar er ment å produsere en annen SomeFlag. I stedet ender du opp med et tall, og du vil ikke måtte caste tilbake til SomeFlag. Jeg tror hvis vi gjorde TypeScript på nytt og fortsatt hadde enums, ville vi laget en egen konstruksjon for bitflagg.