javascript - Använder heltal som värden med ett Typescript Enum?


När man använder heltal som värden i ett Typescript-enum verkar det som om de alla blir nycklar. Här är ett exempel:

enum Precision {
  ONE = 1,
  TWO = 2
}

const keys = Object.keys(Precision)
console.log(keys) //["1", "2", "ONE", "TWO"]

Också om vi försöker få värdena på det här sättet:

let v:number[] = Object.keys(Precision).map(key => Precision[key])

console.log(v)  //["ONE", "TWO", 1, 2]

Är detta ett fel? Är det möjligt att använda heltalsvärden och få den förväntade semantiken? När man använder strängvärden fungerar exemplen ovan bra. Här är en komplett demo:

https://stackblitz.com/edit/typescript-enum-values

Svar #1

Så här fungerar enum i TypeScript. Det skapar ett objekt som kommer att mappa strängnycklar till siffror och siffror tillbaka till dessa nycklar (Dokumentation)

Omvända mappningar

Förutom att skapa ett objekt med egenskapsnamn för medlemmar får medlemmar i numeriska enum också en omvänd avbildning från enumvärden till enum namn.

Så här transpileras enumen till JavaScript (Typescript playground)

var Precision;
(function (Precision) {
    Precision[Precision["ONE"] = 1] = "ONE";
    Precision[Precision["TWO"] = 2] = "TWO";
})(Precision || (Precision = {}));

Det är ett utsmyckat sätt att skriva:

var Precision = {}

Precision["ONE"] = 1
Precision["TWO"] = 2

Precision[1] = "ONE"
Precision[2] = "TWO"

Detta gör det enkelt för dig att konvertera strängvärdet till nummer och numeriskt värde till sträng med hjälp av hakparentesnotationen.

Observera att endast numeriska enumvärden får denna omvända mappning. Om du skapar

enum Precision {
  ONE = "1 value",
  TWO = 2
}

Det omvandlas till:

var Precision = {};

Precision["ONE"] = "1 value"
Precision["TWO"] = 2

Precision[2] = "TWO";

utan "1 value"-nyckeln i objektet