如何比较 TypeScript 中的枚举

新手上路,请多包涵

在 TypeScript 中,我想比较两个包含枚举值的变量。这是我的最小代码示例:

 enum E {
  A,
  B
}

let e1: E = E.A
let e2: E = E.B

if (e1 === e2) {
  console.log("equal")
}

使用 tsc (v 2.0.3) 编译时出现以下错误:

TS2365:运算符“===”不能应用于类型“EA”和“E.B”。

==!==!= 。我尝试添加 const 关键字,但这似乎没有效果。 TypeScript 规范 说明了以下内容:

4.19.3 <、>、<=、>=、==、!=、=== 和 !== 运算符

这些运算符要求一种或两种操作数类型可分配给另一种。结果总是布尔原始类型。

哪个(我认为)解释了错误。但是我怎样才能绕过它呢?

边注

我正在使用带有 atom-typescript 的 Atom 编辑器,并且在我的编辑器中没有收到任何错误/警告。但是当我在同一目录中运行 tsc 时,我得到了上面的错误。我以为他们应该使用相同的 tsconfig.json 文件,但显然情况并非如此。

原文由 John J. Camilleri 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 1.3k
2 个回答

还有另一种方法:如果您不希望生成的 javascript 代码受到任何影响,您可以使用类型转换:

 let e1: E = E.A
let e2: E = E.B

if (e1 as E === e2 as E) {
  console.log("equal")
}

通常,这是由基于控制流的类型推断引起的。使用当前的打字稿实现,只要涉及函数调用,它就会关闭,因此您也可以这样做:

 let id = a => a

let e1: E = id(E.A)
let e2: E = id(E.B)

if (e1 === e2) {
  console.log('equal');
}

奇怪的是,如果 id 函数被声明为返回与其参数完全相同的类型,仍然没有错误:

 function id<T>(t: T): T { return t; }

原文由 artem 发布,翻译遵循 CC BY-SA 3.0 许可协议

将枚举类型转换为字符串是一种非常有价值的技术。

例如;

 if (String(e1) === String(e2)) {
    console.log("equal, now actually works!")
}

原文由 Sydwell 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进