Enums no TypeScript: o que o código JavaScript está fazendo?

O seguinte TypeScript:

enum PrimaryColors { Red, Green, Blue };

Produz o seguinte JavaScript:

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

Tenho vergonha de admitir que não entendo o que o JavaScript está fazendo.
A função entre parênteses está atribuindo valores de string usando outra atribuição como o índice / chave. Eu não vi nada assim antes.
E qual é o propósito do (PrimaryColors || (PrimaryColors = {}) seguindo a função?
Se a resposta for aprender JavaScript corretamente, prontamente aceito, desde que venha com uma fonte sugerida que explique claramente o que estou vendo aqui.