【问题标题】:how typescript enum value compares?打字稿枚举值如何比较?
【发布时间】:2020-08-28 13:43:39
【问题描述】:

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 会说

此条件将始终返回 'false',因为类型 'A' 和 'N1.A' 没有重叠。

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

【问题讨论】:

    标签: typescript enums


    【解决方案1】:

    根据link

    常量枚举只能使用常量枚举表达式,不像正则 枚举它们在编译过程中被完全删除。常量 成员在使用站点内联。这是可能的,因为 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 type1

    所以在编译时 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

    【讨论】:

    • 如果在第一个枚举定义(没有命名空间的那个)之前添加 const 关键字,tsc 仍然会显示相同的错误。为什么字面量类型 1 不能等于字面量类型 1?
    • 我希望您通过我在答案中发布的 SO 线程!对于文字类型比较,需要进行类型转换。
    猜你喜欢
    • 2020-12-17
    • 1970-01-01
    • 2020-04-30
    • 1970-01-01
    • 1970-01-01
    • 2021-02-09
    • 1970-01-01
    • 2019-09-26
    • 2020-01-09
    相关资源
    最近更新 更多