【问题标题】:Why does TypeScript use object property assignments as object keys and variable assignments as function arguments?为什么 TypeScript 使用对象属性赋值作为对象键和变量赋值作为函数参数?
【发布时间】:2019-09-25 01:38:36
【问题描述】:

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 3line 4 上,对象属性分配被用作对象键:

Fruit[Fruit["APPLE"] = 0] = "APPLE";
Fruit[Fruit["ORANGE"] = 1] = "ORANGE";

line 5 上,变量赋值被用作函数参数:

})(Fruit || (Fruit = {}));

据我了解,Fruit = {} 被括在括号中,因此它不是命名参数。

相反,它被评估并作为第一个参数传递给 IIFE,但前提是第一个 Fruitundefined,它可能是 (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";

相反?

【问题讨论】:

    标签: javascript typescript enums compilation


    【解决方案1】:

    赋值的评估是价值。 IIFE 函数的目的是创建一个对象,该对象以 value -> keykey -> value 两种方式工作。

    一个有趣的console.logFruit 本身。


    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";
    

    【讨论】:

      【解决方案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" }
      

      因此,您的示例将无效。

      【讨论】:

      • 感谢您抽出宝贵时间来回答这个问题。
      【解决方案3】:

      表达式Fruit["APPLE"] = 0 的计算结果为0,或键分配的值。这意味着除了分配

      Fruit["APPLE"] = 0
      

      我们也在做这个任务

      Fruit[0] = "APPLE"
      

      这使得您既可以通过其数值获取枚举的字符串名称,也可以通过其字符串名称获取数字值。

      【讨论】:

        猜你喜欢
        • 2014-12-01
        • 1970-01-01
        • 2015-10-17
        • 1970-01-01
        • 1970-01-01
        • 2016-05-07
        • 2017-03-28
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多