为什么TypeScript为什么将对象属性分配用作对象键并将变量分配用作函数参数?

时间:2019-05-07 11:39:38

标签: javascript typescript enums compilation

accepted answer中,标题为"Compile an enum in TypeScript"的问题中包含以下TypeScript:

enum Fruit {APPLE, ORANGE};

已显示可编译为此JavaScript:

var Fruit;
(function (Fruit) {
  Fruit[Fruit["APPLE"] = 0] = "APPLE";
  Fruit[Fruit["ORANGE"] = 1] = "ORANGE";
})(Fruit || (Fruit = {}));

line 3line 4上,对象属性分配被用作对象键:

Fruit[Fruit["APPLE"] = 0] = "APPLE";
Fruit[Fruit["ORANGE"] = 1] = "ORANGE";

line 5上,一个变量赋值被用作函数参数:

})(Fruit || (Fruit = {}));

据我了解,Fruit = {}用括号括起来,因此它不是一个命名参数。

相反,它是作为第一个参数进行评估并传递给IIFE的,但前提是第一个Fruitundefined(可能是(line 1var Fruit;) ,因为TypeScript不允许重复定义。

这对我来说没有意义,为什么TypeScript为什么将对象属性分配用作对象键,将变量分配用作函数参数?

enum编译成这样不是更有意义:

var Fruit = Fruit || {};
Fruit.APPLE = Fruit[0] = "APPLE";
Fruit.ORANGE = Fruit[1] = "ORANGE";

或者这个:

var Fruit = {};
Fruit.APPLE = Fruit[0] = "APPLE";
Fruit.ORANGE = Fruit[1] = "ORANGE";

相反?

3 个答案:

答案 0 :(得分:2)

表达式Fruit["APPLE"] = 0的计算结果为0,即键分配的值。这意味着除了分配

Fruit["APPLE"] = 0

我们也在做这项作业

Fruit[0] = "APPLE"

这使得您既可以通过其数字值获取枚举的字符串名称,也可以通过其字符串名称获取数字值。

答案 1 :(得分:2)

Fruit[Fruit["APPLE"] = 0]并不意味着是Fruit.APPLE

Fruit["APPLE"] = 0Fruit[0]。现在,Fruit[0] = "APPLE"

因此,您将拥有:

Fruit[0] = "APPLE"
Fruit[1] = "ORANGE"

但不是:

Fruit.APPLE = "APPLE"
Fruit.ORANGE = "ORANGE"

因此,将它们包装在IIFE中:

(function (Fruit) {
  // here, Fruit is {}
})(Fruit || (Fruit = {}))

使用时:

Fruit[0] = "APPLE"

最终将成为:

Fruit = { 0: "APPLE", 1: "ORANGE" }

因此,您的示例将无效。

答案 2 :(得分:2)

赋值的评估是值。 IIFE函数的目的是创建一个可以同时使用 value->键 key-> value 的对象。

这里有趣的console.logFruit本身。


var Fruit;

(function (Fruit) {
    Fruit[Fruit["APPLE"] = 50] = "APPLE";
    Fruit[Fruit["ORANGE"] = 10] = "ORANGE";
})(Fruit || (Fruit = {}));

// main.js
var bowl = [Fruit.APPLE, Fruit.ORANGE];
console.log(Fruit);



如果我们从整个解释开始:

将水果传递给IIFE函数,如果它不存在,则将其初始化为空对象{}

然后将第一对键->值插入对象,结果为:

{
  APPLE: 50,
}

(因为分配首先在该行上执行):

Fruit[Fruit["APPLE"] = 50] = "APPLE";

然后将第二对插入到Fruit对象中:

Fruit[50] = "APPLE";