2016-07-19 7 views
2

diesen Code vor:private Mitglieder zugänglich sind in Winkeln 2 Dekorateure

export class Hero { 
    constructor(private id: number, private name: string) {} 
} 

@Component({ 
    selector: 'my-app', 
    template: '<h1>{{title}}</h1><h2>{{hero.name}} details!</h2>' 
}) 
export class AppComponent { 
    private title = "Tour of Heroes"; 
    private hero: Hero = new Hero(1, "Windstorm"); 
} 

In AppComponent ‚s Vorlage Ich schrieb hero.name jedoch dieses Feld nach der Hero Klasse ist privat und nicht zugänglich sein. Wie dieser Code kompiliert und funktioniert? Fehle ich etwas?

EDIT: Lesen Sie die Antworten auf, warum es passiert, hier ist meine Art und Weise der Umgang mit diesem, es ist kein fix, aber es hält die Dinge besser organisiert und sicher neben Accessoren sind immer gut zu nutzen:

export class Hero { 
    constructor(private _id: number, private _name: string) { } 

    get name(): string { 
     return this._name; 
    } 

    get id(): number { 
     return this._id; 
    } 
} 

@Component({ 
    selector: 'my-app', 
    template: '<h1>{{title}}</h1><h2>{{hero.name}} details!</h2>' 
}) 
export class AppComponent { 
    private title = "Tour of Heroes"; 
    private hero: Hero = new Hero(1, "Windstorm"); 
} 

Wenn hero.name in JS ausgeführt wird, sollte es die JS-kompilierte Getterfunktion aufrufen, die Sie in Ihrem TS-Code definiert haben, dies sollte eine Art Kontrolle über die Eigenschaften geben, während TS-Codestil beibehalten wird.

+0

Vielleicht versuchen 'exportieren Klasse Hero {private name: string}' (dh nicht als ein Argument für den Konstruktor) –

+0

Es kompiliert noch, ich glaube, es hat etwas mit TypScript-Transpiler als JS hat keine privaten Mitglieder ursprünglich , macht das Sinn? – Israelg99

Antwort

3

In JavaScript gibt es keine privaten Variablen. Schlüsselwörter wie private werden nur vom TypeScript-Transpiler verwendet, um Abhängigkeiten vor dem Transpilieren zu erzwingen. Sobald der Code in JavasScript übertragen wurde, ist die Eigenschaft name ein sichtbares Mitglied der Hero-Klasse.

+0

Ja, ich glaubte, das könnte der Grund sein, ich hoffte, TS oder vielleicht eckig wird die Vorkompilierung des Dekorateurs überprüfen, aber es ist nur eine Saite, die nach dem Transpilieren eckig füllt, nehme ich an. – Israelg99

1

Das Schlüsselwort private in Typescript wird nur für die Überprüfung der Kompilierzeit verwendet und beschränkt den Zugriff zur Laufzeit nicht wirklich auf irgendetwas. Der Typoskript-Compiler prüft Ihre Vorlagen nicht, sodass das Problem nicht erkannt wird.

Ich glaube, einige IDE (VS-Code und WebStorm) auf Typ arbeiten, um Ihre Vorlagen Überprüfung aber jetzt sind Sie an Ihrem eigenen

+0

Ich verwende VS-Code, Sie denken, es gibt eine Erweiterung für Typprüfschablonen? Ich bin mir sicher, dass es mit der API von VS Code möglich ist. – Israelg99

+1

Ich glaube, dass das Angular 2-Team eine API für das Parsen von Templates veröffentlicht hat, damit IDEs Code-Vervollständigung und Typprüfung durchführen können. Sieht aus, als ob es bereits teilweise in WebStorm unterstützt wird https://blog.jetbrains.com/webstorm/2016/04/angular-2-workflow-in-webstorm/#ng2-completion Kann keine offiziellen Quellen dafür finden VS Code, aber es ist wahrscheinlich nur eine Frage der Zeit, bis sie es unterstützen – rob

+0

das ist gut zu wissen, btw @rob würde es Ihnen etwas ausmachen, einen Blick auf meine Bearbeitung und lassen Sie mich wissen, wenn Sie 'held.name' in der Vorlage wird Rufe den JS-kompilierten 'name' Getter in meinem TS-Skript auf? – Israelg99

Verwandte Themen