在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 = {}));
在第 3 行
和第 4 行
中,对象属性赋值被用作对象键:
Fruit[Fruit["APPLE"] = 0] = "APPLE";
Fruit[Fruit["ORANGE"] = 1] = "ORANGE";
在第 5 行
,变量赋值被用作函数参数:
})(Fruit || (Fruit = {}));
据我所知,Fruit = {}
包含在括号中,因此它不是命名参数。
相反,它被评估并作为第一个参数传递给 IIFE,但前提是第一个 Fruit
是 undefined
,它可能是(第 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";
代替?
最佳答案
赋值的评估就是值。 IIFE 函数的目的是创建一个以 value -> key 和 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);
如果我们重新开始整个解释:
Fruit 被传递给 IIFE 函数,如果它不存在,它被初始化为一个空对象{}
。
然后将第一对 key -> value 插入到对象中,结果为:
{
APPLE: 50,
}
(因为赋值先行执行):
Fruit[Fruit["APPLE"] = 50] = "APPLE";
然后将第二对插入到 Fruit
对象中:
Fruit[50] = "APPLE";
关于javascript - 为什么 TypeScript 使用对象属性赋值作为对象键并使用变量赋值作为函数参数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56021786/