在标题为“Compile an enum in TypeScript”的问题的accepted answer中,出现以下TypeScript:
enum Fruit {APPLE, ORANGE};
显示编译为此JavaScript:
var Fruit;
(function (Fruit) {
Fruit[Fruit["APPLE"] = 0] = "APPLE";
Fruit[Fruit["ORANGE"] = 1] = "ORANGE";
})(Fruit || (Fruit = {}));
在第3行和第4行,对象属性赋值被用作对象键:
Fruit[Fruit["APPLE"] = 0] = "APPLE";
Fruit[Fruit["ORANGE"] = 1] = "ORANGE";
在第5行,变量赋值被用作函数参数:
})(Fruit || (Fruit = {}));
根据我的理解,Fruit = {}包含在括号中,因此它不是命名参数.
相反,它被评估并传递给IIFE作为它的第一个参数,但只有当第一个Fruit未定义时,它可能是(第1行:var Fruit;),因为TypeScript不允许重复定义.
这对我来说没有意义,为什么TypeScript使用对象属性赋值作为对象键和变量赋值作为函数参数?
将枚举编译成这样是不是更有意义:
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";
代替?
解决方法:
分配的评估是价值. IIFE函数的目的是创建一个双向值的对象 – >密钥和密钥 – >值.
这里有一个有趣的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);
如果我们重新开始解释:
Fruit被传递给IIFE函数,如果它不存在,它被初始化为一个空对象{}.
然后第一对键 – >将值插入到对象中,结果如下:
{
APPLE: 50,
}
(因为分配首先在线上执行):
Fruit[Fruit["APPLE"] = 50] = "APPLE";
然后将第二对插入到Fruit对象中:
Fruit[50] = "APPLE";