Enums en TypeScript: ¿qué está haciendo el código JavaScript?

El siguiente TypeScript:

enum PrimaryColors { Red, Green, Blue };

Produce el siguiente JavaScript:

var PrimaryColors;
(function (PrimaryColors) {
    PrimaryColors[PrimaryColors["Red"] = 0] = "Red";
    PrimaryColors[PrimaryColors["Green"] = 1] = "Green";
    PrimaryColors[PrimaryColors["Blue"] = 2] = "Blue";
})(PrimaryColors || (PrimaryColors = {}));
;

Me avergüenza admitir que no entiendo lo que hace JavaScript.
La función entre paréntesis es asignar valores de cadena utilizando otra asignación como el índice / clave. No he visto nada como esto antes.
¿Y cuál es el propósito de (PrimaryColors || (PrimaryColors = {}) después de la función?
Si la respuesta es aprender JavaScript correctamente, lo aceptaré fácilmente, siempre que venga con una fuente sugerida que explique claramente lo que estoy viendo aquí.

Respuestas a la pregunta(3)

Su respuesta a la pregunta