Att förstå "public"/"private" i TypeScript-klass
I nedanstående TypeScript-kod, oavsett om namnet är "public" eller "private", är den genererade JavaScript-koden densamma.
Så min fråga är, hur bestämmer man när konstruktorns parameter ska vara offentlig eller privat?
// typescript code
class Animal {
constructor( public name: string) {
}
}
// generated JS code
var Animal = (function () {
function Animal(name) {
this.name = name;
}
return Animal;
}());
Svar #1
De publika, privata och skyddade åtkomstmodifierarna påverkar, som du har upptäckt, faktiskt inte den slutliga kod som genereras. Vad de påverkar är typkontrollen vid kompileringstid.
Vad gör de egentligen?
Som deras namn antyder begränsar public och private-modifierarna vad som kan komma åt klassmedlemmen. Det finns också en tredje modifierare i klassen, protected.
Modifieraren private tillåter endast att en klassmedlem (variabel eller metod) nås inom den klassen.
Modifieraren protected tillåter allt som modifieraren private gör, och tillåter också andra klasser som ärver den klassen att använda den.
Slutligen gör public-modifieraren så att allt som kan komma åt klassen också har tillgång till den publika klassens egenskap.
För en mer djupgående förklaring och exempel, ta en titt på den officiella TypeScript-handbokens förklaring.
Om allt kompileras likadant, varför skulle jag använda modifierarna?!
Att använda modifierare gör det möjligt för kompilatorn att säkerställa att din kod inte använder saker som den inte borde använda. Detta är samma resonemang som bakom att använda typer från första början; det gör det svårare att göra misstag som egentligen inte borde kunna göras från första början! Som en extra bonus, om din textredigerare har stöd för TypeScript, kommer den också att använda åtkomstmodifierare när den visar autokomplettering för variabler och metoder.
Svar #2
JavaScript-koden som genereras är densamma
De producerar samma JavaScript men har inte samma semantik vad gäller typen.
Medlemmen private kan bara nås från insidan av klassen medan public kan nås externt.
Mer
Skillnaderna täcks här: https://basarat.gitbooks.io/typescript/content/docs/classes.html#access-modifiers
Ett annat exempel
let foo = 123;
kommer att generera samma ES5 som
const foo = 123;
Men i det första fallet let foo=123;foo=456 kommer att kompileras utan problem men const foo=123; foo=456 kommer att resultera i ett kompileringsfel.
