javascript – 为什么TypeScript使用对象属性赋值作为对象键和变量赋值作为函数参数?

在标题为“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";
上一篇:C#语言和SQL Server数据库技术


下一篇:c – 具有多个主电源和共享功能的CMake编译项目