在标题为“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";
原文地址:https://codeday.me/bug/20190823/1696874.html
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。