TypeScript 是如何实现枚举的?

How typescript implements enumerations?

我想知道打字稿如何将枚举编译成 javascript 代码。所以我实现了下面的例子:

enum Contagens {
    UM,
    DOIS,
    TRES
}

编译成这样:

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

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

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

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

enum Contagens {
    UM,
    DOIS,
    TRES
}

enum Contagens {
    CATRE = 4
}
  1. 函数 function (Contagens) { 接受一个参数 Contagens,它是步骤 #2 的值。在此函数中,它将在枚举对象上创建条目。它与外部变量 Contagens 同名,因此它隐藏了该变量。但它是相同的值,所以这无关紧要。

  2. 作业。

Contagens[Contagens["UM"] = 0] = "UM";

赋值的结果就是赋值。* 所以 Contagens["UM"] = 0 做了两件事。它将键 "UM" 设置为值 0,并且 returns 0.

然后在第二个作业中使用 returned 0:

Contagens[0] = "UM";

现在 "UM" 属性 已分配给 00 属性 已分配给 "UM"。枚举现在看起来像这样:

{ UM: 0, "0": "UM" }

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

Contagens.UM // 0
Contagens[0] // "UM"

哪个好用!


* delcaring一个变量时赋值的结果是undefined,但是赋值一个对象的属性或者赋值给一个已经存在的变量都会return 赋值。 JS就是那样古怪。