打字稿枚举值如何比较?

时间:2020-08-28 13:43:39

标签: typescript enums

enter image description here

enum A {
   a = 1,
   b = 2
}

namespace N1 {
   export enum A {
       a = 1,
       b = 2
   }
}
// it will pass type check
console.log(A.a === N1.A.a)

当我删除const关键字时,表达式将通过类型检查。

但是如果添加了const,则tsc说

由于类型“ A”和“ “ N1.A”没有重叠。

我想知道TS中的枚举如何在幕后比较枚举值。

1 个答案:

答案 0 :(得分:1)

根据link

const枚举只能使用常量枚举表达式,与常规的枚举不同 枚举它们在编译过程中被完全删除。常量 成员在使用站点内联。这是可能的,因为const枚举 不能具有计算所得的成员。

为说明以下代码-

enum A {
   a = 1,
   b = 2
}

namespace N1 {
   export const enum A {
       a = 1,
       b = 2
   }
}

console.log(N1.A.a);
console.log(A.a);

,它将被转换为-

"use strict";
var A;
(function (A) {
    A[A["a"] = 1] = "a";
    A[A["b"] = 2] = "b";
})(A || (A = {}));
console.log(1);
console.log(A.a);

如您所见-

  1. 已编译的代码中没有const enum A的引用。
  2. 将打印N1.A.a的控制台输出转换为literal type 1

因此,在编译时无法比较literal type 1A.a,因此您必须将const enum转换为如下所示的数字-

console.log(N1.A.a as number === A.a) 

您可以在下面的线程中进一步检查文字类型比较-

Operator '==' cannot be applied to types x and y in Typescript 2