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

fas*_*sth 8 javascript enums json typescript angular

我有非常简单的代码:

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))
Run Code Online (Sandbox Code Playgroud)

现在我想检查一下:

console.log(brush.color === Color.BLUE)
Run Code Online (Sandbox Code Playgroud)

它返回false

我尝试了一些组合,例如

brush.color === Color[Color.BLUE]
Run Code Online (Sandbox Code Playgroud)

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

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

gyr*_*yre 7

问题在于 TypeScriptenum实际上是“命名数字常量”。

来自senum的打字稿文档

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

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

您应该改用字符串文字类型

type Color = "BLUE" | "RED";
Run Code Online (Sandbox Code Playgroud)


完整代码(查看演示):

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
Run Code Online (Sandbox Code Playgroud)


rai*_*7ow 7

另一种选择(自 TS 2.4 起可用)是String enums

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

console.log('BLUE' === Color.BLUE); // true
Run Code Online (Sandbox Code Playgroud)

由于字符串枚举没有反向映射(至少在 2020 年),因此人们可能会强烈考虑使用const修饰符内联它们。