Почему TypeScript использует назначения свойств объекта в качестве ключей объекта и назначения переменных в качестве аргументов функции? - PullRequest
3 голосов
/ 07 мая 2019

В принятом ответе на вопрос с названием "Составить перечисление в TypeScript" , следующий TypeScript:

enum Fruit {APPLE, ORANGE};

Показано, что компилируется в этот JavaScript:

var Fruit;
(function (Fruit) {
  Fruit[Fruit["APPLE"] = 0] = "APPLE";
  Fruit[Fruit["ORANGE"] = 1] = "ORANGE";
})(Fruit || (Fruit = {}));

Вкл. line 3 и line 4 В качестве ключа объекта используется присвоение свойства объекта:

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

И вкл. line 5 в качестве аргумента функции используется присвоение переменной:

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

Насколько я понимаю, Fruit = {} заключен в скобки, поэтому он не является именованным аргументом.

Вместоон оценивается и передается во IIFE в качестве первого аргумента, но только если первый Fruit равен undefined, что, вероятно, равно (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";

Вместо

Ответы [ 3 ]

2 голосов
/ 07 мая 2019

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

Следовательно, ваш пример будет неверным.

2 голосов
/ 07 мая 2019

Оценка присваивания является значением.Цель функции 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);


Если мы начнем с полного объяснения:

Фрукты передаются в функцию IIFE, если они не существуют,он инициализируется как пустой объект {}.

Затем первая пара ключ -> значение вставляется в объект, что приведет к:

{
  APPLE: 50,
}

(Поскольку присвоение выполняется первым в строке):

Fruit[Fruit["APPLE"] = 50] = "APPLE";

Затем вторая пара вставляется в Fruit объект:

Fruit[50] = "APPLE";
2 голосов
/ 07 мая 2019

Выражение Fruit["APPLE"] = 0 оценивается как 0 или значение назначения клавиши. Это означает, что в дополнение к назначению

Fruit["APPLE"] = 0

мы также выполняем это задание

Fruit[0] = "APPLE"

, что позволяет получить как строковое имя перечисления по его числовому значению, так и числовое по его строковому имени.

...