Enums in TypeScript: what is the JavaScript code doing?
enums, iife, javascript, typescript
Solution
I believe:
PrimaryColors[PrimaryColors["Red"] = 0] = "Red";
is equivalent to:
PrimaryColors[0] = "Red";
PrimaryColors["Red"] = 0;
See this reference.
The expression x = 7 is an example of the first type. This expression uses the = operator to assign the value seven to the variable x. The expression itself evaluates to seven.
For example:
console.log((x = 7));
outputs:
7
Similarly:
var x = {};
console.log((x["hi"] = 7));
Also outputs 7.
As for the second thing, `PrimaryColors` is initially undefined.
var x;
console.log(x); // undefined
In a boolean context, `undefined` evaluates to `false`:
console.log(!undefined); // true
console.log(!!undefined); // false
Sanity check:
console.log((!undefined) === true); // true
console.log((!!undefined) === false); // true
console.log(undefined === false); // false
This is a common usage of short circuiting. Because `PrimaryColors` is initially undefined (false), it will pass `{}` to the function.
PrimaryColors || (PrimaryColors = {})
Problem
The following TypeScript: ``` enum PrimaryColors { Red, Green, Blue }; ``` Produces the following JavaScript: ``` var PrimaryColors; (function (PrimaryColors) { PrimaryColors[PrimaryColors["Red"] = 0] = "Red"; PrimaryColors[PrimaryColors["Green"] = 1] = "Green"; PrimaryColors[PrimaryColors["Blue"] = 2] = "Blue"; })(PrimaryColors || (PrimaryColors = {})); ; ``` I am embarrassed to admit that I don't understand what the JavaScript is doing. The function in parentheses is assigning string values using another assignment as the index/key. I have not seen anything like this before. And what is the purpose of the (PrimaryColors || (PrimaryColors = {}) following the function? If the answer is to learn JavaScript properly, I will readily accept it, provided it comes with a suggested source that clearly explains what I am seeing here.