在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 3
和line 4
上,对象属性分配被用作对象键:
Fruit[Fruit["APPLE"] = 0] = "APPLE";
Fruit[Fruit["ORANGE"] = 1] = "ORANGE";
在line 5
上,一个变量赋值被用作函数参数:
})(Fruit || (Fruit = {}));
据我了解,Fruit = {}
用括号括起来,因此它不是一个命名参数。
相反,它是作为第一个参数进行评估并传递给IIFE的,但前提是第一个Fruit
是undefined
(可能是(line 1
:var 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";
相反?
答案 0 :(得分:2)
表达式Fruit["APPLE"] = 0
的计算结果为0
,即键分配的值。这意味着除了分配
Fruit["APPLE"] = 0
我们也在做这项作业
Fruit[0] = "APPLE"
这使得您既可以通过其数字值获取枚举的字符串名称,也可以通过其字符串名称获取数字值。
答案 1 :(得分:2)
Fruit[Fruit["APPLE"] = 0]
并不意味着是Fruit.APPLE
:
Fruit["APPLE"] = 0
是Fruit[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.log
是Fruit
本身。
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";