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中的枚举如何在幕后比较枚举值。
答案 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);
如您所见-
const enum A
的引用。N1.A.a
的控制台输出转换为literal type
1
。因此,在编译时无法比较literal type 1
和A.a
,因此您必须将const enum
转换为如下所示的数字-
console.log(N1.A.a as number === A.a)
您可以在下面的线程中进一步检查文字类型比较-
Operator '==' cannot be applied to types x and y in Typescript 2