Búsqueda de sitios web

javascript - ¿Usar enteros como valores con un Enum de Typescript?


Cuando se usan enteros como valores en un enum de Typescript, parece que todos se convierten en claves. Aquí hay un ejemplo:

enum Precision {
  ONE = 1,
  TWO = 2
}

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

También, si intentamos obtener los valores así:

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

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

¿Es esto un error? ¿Es posible usar valores enteros y obtener la semántica esperada? Al usar valores de cadena, los ejemplos anteriores resultan bien. Aquí hay una demostración completa:

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

Respuesta #1

Así es como enum funciona en TypeScript. Crea un objeto que mapeará las claves de cadena a números y los números de vuelta a esas claves (Documentación)

Mapeos inversos

Además de crear un objeto con nombres de propiedad para los miembros, los miembros de los enums numéricos también obtienen un mapeo inverso de los valores del enum a los nombres del enum.

Así es como el enum se transpila a JavaScript (playground de TypeScript)

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

Eso es una manera elegante de escribir:

var Precision = {}

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

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

Esto facilita que conviertas el valor de cadena a número y el valor numérico a cadena usando la notación de corchetes.

Tenga en cuenta que solo los valores numéricos del enum obtienen este mapeo inverso. Si crea

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

Se convierte en:

var Precision = {};

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

Precision[2] = "TWO";

sin la clave "1 value" en el objeto