typescript如何实现枚举?

cj-*_*307 2 javascript enums node.js typescript

我想知道 typescript 如何将枚举编译成 javascript 代码。所以我实现了以下示例:

enum Contagens {
    UM,
    DOIS,
    TRES
}
Run Code Online (Sandbox Code Playgroud)

它被编译成这样:

"use strict";
var Contagens;
(function (Contagens) {
    Contagens[Contagens["UM"] = 0] = "UM";
    Contagens[Contagens["DOIS"] = 1] = "DOIS";
    Contagens[Contagens["TRES"] = 2] = "TRES";
})(Contagens || (Contagens = {}));
Run Code Online (Sandbox Code Playgroud)

但是,我不明白它是如何工作的......有人可以向我解释这段代码吗?

Ale*_*yne 5

  1. 变量var Contagens;这将创建一个变量来保存对枚举的引用。

  2. 如果枚举已经存在,则使用参数Contagens || (Contagens = {})enum;如果不存在,则将其设置为空对象。这允许扩展枚举:

enum Contagens {
    UM,
    DOIS,
    TRES
}

enum Contagens {
    CATRE = 4
}
Run Code Online (Sandbox Code Playgroud)
  1. 该函数function (Contagens) {采用一个参数,Contagens该参数是步骤 #2 中的值。在此函数中,它将在枚举对象上创建条目。它与外部变量具有相同的名称Contagens,因此它会隐藏该变量。但它的值是相同的,所以这并不重要。

  2. 分配。

Contagens[Contagens["UM"] = 0] = "UM";
Run Code Online (Sandbox Code Playgroud)

赋值的结果就是被赋值的值。*Contagens["UM"] = 0有两件事也是如此。它将键设置"UM"为值0,然后返回0

返回的结果0将在第二个赋值中使用:

Contagens[0] = "UM";
Run Code Online (Sandbox Code Playgroud)

现在"UM"房产已经转让00房产已转让给"UM"。枚举现在看起来像这样:

{ UM: 0, "0": "UM" }
Run Code Online (Sandbox Code Playgroud)

这允许您通过名称查找枚举中的值,或从其值获取其名称。

Contagens.UM // 0
Contagens[0] // "UM"
Run Code Online (Sandbox Code Playgroud)

这很方便!


*声明变量时赋值的结果是undefined,但赋值对象的属性或赋值给现有变量将返回赋值的值。JS 就是这么古怪。