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.
