Ich betrachte die Implementierung privater Mitglieder in TypeScript und finde es etwas verwirrend. Intellisense erlaubt keinen Zugriff auf private Mitglieder, aber in reinem JavaScript ist alles vorhanden. Dies lässt mich denken, dass TS private Mitglieder nicht korrekt implementiert. Irgendwelche Gedanken?
class Test{
private member: any = "private member";
}
alert(new Test().member);
javascript
typescript
Sean Feldman
quelle
quelle
Antworten:
Genau wie bei der Typprüfung wird die Privatsphäre der Mitglieder nur innerhalb des Compilers durchgesetzt.
Eine private Eigenschaft wird als reguläre Eigenschaft implementiert, und Code außerhalb der Klasse darf nicht darauf zugreifen.
Um etwas innerhalb der Klasse wirklich privat zu machen, kann es kein Mitglied der Klasse sein. Es ist eine lokale Variable, die in einem Funktionsbereich innerhalb des Codes erstellt wird, der das Objekt erstellt. Das würde bedeuten, dass Sie nicht wie ein Mitglied der Klasse darauf zugreifen können, dh wenn Sie das
this
Schlüsselwort verwenden.quelle
this
Schlüsselwort darauf zu.JavaScript unterstützt private Variablen.
In TypeScript würde dies folgendermaßen ausgedrückt:
BEARBEITEN
Dieser Ansatz sollte nur sparsam angewendet werden, wenn dies unbedingt erforderlich ist. Zum Beispiel, wenn Sie ein Passwort vorübergehend zwischenspeichern müssen.
Die Verwendung dieses Musters verursacht Leistungskosten (unabhängig von Javascript oder Typescript) und sollte nur verwendet werden, wenn dies unbedingt erforderlich ist.
quelle
var _this
ganze Zeit, indem es für die Verwendung in Funktionen mit Gültigkeitsbereich festgelegt wird? Warum sollten Sie Bedenken haben, dies im Klassenbereich zu tun?Sobald die Unterstützung für WeakMap weiter verbreitet ist , gibt es eine interessante Technik , die in Beispiel # 3 detailliert hier .
Es ermöglicht private Daten UND vermeidet die Leistungskosten des Beispiels von Jason Evans, indem auf die Daten über Prototypmethoden anstatt nur über Instanzmethoden zugegriffen werden kann.
Auf der verknüpften MDN WeakMap-Seite wird die Browserunterstützung für Chrome 36, Firefox 6.0, IE 11, Opera 23 und Safari 7.1 aufgeführt.
quelle
protected
Parameter? : DDa TypeScript 3.8 veröffentlicht wird, können Sie ein privates Feld deklarieren, auf das außerhalb der enthaltenen Klasse nicht zugegriffen oder das sogar erkannt werden kann .
Private Felder beginnen mit
#
ZeichenBitte beachten Sie, dass diese privaten Felder etwas anderes sind als Felder, die mit einem
private
Schlüsselwort markiert sindRef. https://devblogs.microsoft.com/typescript/announcing-typescript-3-8-beta/
quelle
Vielen Dank an Sean Feldman für den Link zur offiziellen Diskussion zu diesem Thema - siehe seine Antwort für den Link.
Ich habe die Diskussion gelesen, mit der er verlinkt hat, und hier ist eine Zusammenfassung der wichtigsten Punkte:
this
ohne eine Problemumgehung@private
solchen Minifizierern, die erkennen, dass durch Annotation die Methodennamen effektiv minimiert werden könnenAllgemeine Gegenargumente zum Hinzufügen von Sichtbarkeitsunterstützung in ausgegebenem Code:
quelle
In TypeScript sind private Funktionen nur innerhalb der Klasse verfügbar. Mögen
Und es wird ein Fehler angezeigt, wenn Sie versuchen, auf ein privates Mitglied zuzugreifen. Hier ist das Beispiel:
quelle
Mir ist klar, dass dies eine ältere Diskussion ist, aber es könnte immer noch nützlich sein, meine Lösung für das Problem der angeblich privaten Variablen und Methoden in einem TypeScript zu teilen, das in die öffentliche Schnittstelle der kompilierten JavaScript-Klasse "eindringt".
Für mich ist dieses Problem rein kosmetischer Natur, dh es geht nur um die visuelle Unordnung, wenn eine Instanzvariable in DevTools angezeigt wird. Mein Fix besteht darin, private Deklarationen in einer anderen Klasse zu gruppieren, die dann in der Hauptklasse instanziiert und einer
private
(in JS noch öffentlich sichtbaren) Variablen mit einem Namen wie__
(doppelter Unterstrich) zugewiesen wird .Beispiel:
Wenn die
myClass
Instanz in DevTools angezeigt wird, werden nicht alle "privaten" Mitglieder mit wirklich öffentlichen Mitgliedern vermischt (was in korrekt überarbeitetem Code im wirklichen Leben sehr unübersichtlich werden kann), sondern ordentlich in der reduzierten__
Eigenschaft gruppiert :quelle
Hier ist ein wiederverwendbarer Ansatz zum Hinzufügen geeigneter privater Eigenschaften:
Angenommen, Sie haben
Client
irgendwo eine Klasse , die zwei private Eigenschaften benötigt:prop1: string
prop2: number
Im Folgenden wird beschrieben, wie Sie es implementieren:
Und wenn Sie nur ein einzelnes Privateigentum benötigen, wird es noch einfacher, da Sie
ClientPrivate
in diesem Fall keine definieren müssten .Es ist erwähnenswert, dass die Klasse zum größten Teil
Private
nur eine gut lesbare Signatur bietet, während die direkte VerwendungWeakMap
dies nicht tut.quelle