javascript - Hvorfor bruker TypeScript objekt-eiendomsoppdrag som objekt-nøkler og variabeloppdrag som funksjonsargumenter?


I det aksepterte svaret på et spørsmål med tittelen "Kompilere en enum i TypeScript", følgende TypeScript:

enum Fruit {APPLE, ORANGE};

Vises å kompilere til denne JavaScript:

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

På linje 3 og linje 4 blir en objekt-egenskaps tildeling brukt som en objekt-nøkkel:

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

Og på linje 5 blir en variabeltilordning brukt som et funksjonsargument:

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

Så vidt jeg forstår, er Fruit={} pakket inn i parenteser slik at det ikke er et navngitt argument.

I stedet blir det evaluert og sendt til IIFE-en som dens første argument, men bare hvis den første Fruit er undefined, noe den sannsynligvis er (linje 1: var Fruit;), siden TypeScript ikke tillater dupliserte definisjoner.

Dette gir ingen mening for meg, hvorfor bruker TypeScript objekt-egenskapsoppgaver som objekt-nøkler og variabeloppgaver som funksjonsargumenter?

Ville det ikke gi mer mening å kompilere enum til dette:

var Fruit = Fruit || {};
Fruit.APPLE = Fruit[0] = "APPLE";
Fruit.ORANGE = Fruit[1] = "ORANGE";

Eller dette:

var Fruit = {};
Fruit.APPLE = Fruit[0] = "APPLE";
Fruit.ORANGE = Fruit[1] = "ORANGE";

I stedet?

Svar #1

Evalueringen av en tildeling er verdien. Formålet med IIFE-funksjonen er å lage et objekt som fungerer begge veier verdi -> nøkkel og nøkkel -> verdi.

En interessant console.log her er Fruit selv.

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

Hvis vi begynner på nytt hele forklaringen:

Frukt sendes til IIFE-funksjonen, hvis det ikke eksisterer, blir det initialisert som et tomt objekt {}.

Da blir det første paret nøkkel -> verdi satt inn i objektet, som vil resultere som:

{
  APPLE: 50,
}

(Fordi tildelingen utføres først på linjen) :

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

Deretter settes det andre paret inn i Fruit-objektet:

Fruit[50] = "APPLE";

Svar #2

Uttrykket Fruit["APPLE"]=0 evalueres til 0, eller verdien av nøkkeltilordningen. Det betyr at i tillegg til å tilordne

Fruit["APPLE"] = 0

vi gjør også denne oppgaven

Fruit[0] = "APPLE"

noe som gjør at du både kan få strengnavnet til enumen ved dens tallverdi og tallverdien ved dens strengnavn.

Relaterte artikler