在TypeScript中,将值与枚举进行比较并不明显

时间:2017-03-25 02:02:11

标签: javascript json angular typescript enums

我的代码非常简单:

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))

现在我想检查一下:

console.log(brush.color === Color.BLUE)

它返回false

我尝试了一些像

这样的组合
brush.color === Color[Color.BLUE]

但是,当然会遇到编译器错误。

问题是如何进行基本比较enum === enum

2 个答案:

答案 0 :(得分:3)

问题是TypeScript enum实际上是#34;命名为数字常量。"

来自the TypeScript documentation on enums

  

Enums允许我们定义一组命名的数字常量。

     

枚举的主体由零个或多个枚举成员组成。枚举成员具有与之关联的数值( sic )。 。

您应该使用string literal types代替:

type Color = "BLUE" | "RED";

<小时/>

完整代码(View Demo):

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"); //=> true

答案 1 :(得分:2)

另一种(available since TS 2.4)是String enums

enum Color {
  BLUE = "BLUE",
  RED = "RED"
}

console.log('BLUE' === Color.BLUE); // true

由于没有针对字符串枚举的反向映射(至少在2020年),因此强烈建议考虑使用const修饰符对它们进行内联。