Tengo un código muy sencillo:
enum Color { BLUE, RED } class Brush { color: Color constructor(values) { this.color = values.color } } let JSON_RESPONSE = `{"color": "BLUE"}` let brush = new Brush(JSON.parse(JSON_RESPONSE))Ahora quiero hacer una comprobación:
console.log(brush.color === Color.BLUE) Y devuelve false .
Probé algunas combinaciones como
brush.color === Color[Color.BLUE]Pero, por supuesto, tiene un error de compilación.
La pregunta es cómo hacer una comparación bastante básica enum === enum ?
El problema es que las enum de TypeScript son en realidad "constantes numéricas con nombre".
De la documentación de TypeScript en enum s :
Las enumeraciones nos permiten definir un conjunto de constantes numéricas con nombre.
El cuerpo de una enumeración consta de cero o más miembros de enumeración. Los miembros de la enumeración tienen un valor numérico ( sic ) asociado con ellos . . .
En su lugar, debería usar tipos de literales de cadena :
type Color = "BLUE" | "RED"; type Color = "BLUE" | "RED"; class Brush { color: Color constructor(values) { this.color = values.color } } let JSON_RESPONSE = `{"color": "BLUE"}` let brush = new Brush(JSON.parse(JSON_RESPONSE)) console.log(brush.color === "BLUE"); //=> trueUna alternativa ( disponible desde TS 2.4 ) son las enumeraciones de cadenas :
enum Color { BLUE = "BLUE", RED = "RED" } console.log('BLUE' === Color.BLUE); // true Como no hay un mapeo inverso para las enumeraciones de cadenas (al menos en 2020), uno podría considerar seriamente incluirlas con el modificador const .