TypeScript-Klassen: Wer darf auf welches Member zugreifen

TypeScript-Klassen

TypeScript-Klassen: Modifier, readonly, abstract, implements | We.Inc

Felder, Konstruktoren, Parameter Properties, public, protected, private und #private, readonly, abstract und implements. Teste in einer Live-Matrix, wer jedes Member erreichen kann.

Eine TypeScript-Klasse ist eine JavaScript-Klasse mit typisierten Feldern und Zugriffsregeln. public-Member sind überall erreichbar, protected-Member innerhalb der Klasse und ihrer Unterklassen, private-Member nur innerhalb der Klasse. Diese drei Prüfungen gibt es nur zur Compile-Zeit. Ein #name-Feld ist auch im laufenden JavaScript privat, und readonly verhindert Schreibzugriffe nach dem Konstruktor.

Klassen-Schlüsselwörter und was sie bewirken

Wähle einen Modifier, und die Matrix zeigt fünf Wege, auf denen Code dieses Member erreichen könnte, jeweils mit dem Ergebnis von tsc. Die Zeile mit der Klammer-Schreibweise überrascht viele: Die Compile-Zeit-Modifier lassen sich mit einem String-Schlüssel umgehen, ein #-Feld dagegen nicht.

Häufige Fragen

Was ist der Unterschied zwischen private und #private?

private ist eine TypeScript-Prüfung. Sie verschwindet aus der Ausgabe, und obj["secret"] kompiliert trotzdem und liest den Wert. Ein #secret-Feld ist ein privates JavaScript-Feld: Kein String-Schlüssel erreicht es, und Code außerhalb der Klasse kann es zur Laufzeit nicht lesen.

Was sind Parameter Properties?

Eine Abkürzung, die ein Feld aus einem Konstruktorparameter deklariert und zuweist. constructor(private readonly id: string) {} erzeugt ein privates readonly-Feld id, ganz ohne Rumpf. Das Präfix kann public, protected, private oder readonly sein.

Ändert implements die Typen in meiner Klasse?

Nein. implements prüft nur, ob die fertige Klasse zum Interface passt. Methodenparameter brauchen trotzdem eigene Annotationen; lässt du eine im strict-Modus weg, ist das ein implicit-any-Fehler, obwohl das Interface den Typ bereits nennt.

Warum meldet TypeScript, dass eine Property keinen Initialisierer hat?

strictPropertyInitialization, das strict aktiviert, verlangt, dass jedes deklarierte Feld in der Deklaration oder im Konstruktor gesetzt wird. Gib ihm einen Wert, mach es optional oder setze ! hinter den Namen, wenn etwas anderes es vor der Verwendung setzt.

Wann sollte ich eine abstrakte Klasse statt eines Interfaces verwenden?

Nimm eine abstrakte Klasse, wenn Unterklassen echten Code teilen sollen, etwa eine Methode, die einen abstrakten Hook aufruft. Ein Interface enthält keinen Code, und eine Klasse kann mehrere davon implementieren, daher eignet es sich zum Beschreiben von Formen.

Felder, Konstruktoren und Parameter Properties

Privatsphäre zur Compile-Zeit und zur Laufzeit

Klassen und Interfaces arbeiten zusammen

Klassenmuster in der Praxis

Parameter Properties und ein #-Feld

Der Konstruktor deklariert zwei Felder in seiner Parameterliste. Der Cache ist ein #-Feld, daher kann nichts außerhalb der Klasse ihn lesen oder leeren.

Eine abstrakte Basis mit override

describe ist gemeinsamer Code; area ist der Hook, den jede Form liefern muss. Mit aktivem noImplicitOverride ist das Schlüsselwort override bei area in Circle Pflicht.

implements prüft, es leitet nichts ab

Das Interface stellt sicher, dass die Klasse send mit der richtigen Form hat, aber der Parameter braucht trotzdem seine eigene Typannotation.

Keine Einschränkungen. Den Modifier wegzulassen bedeutet dasselbe.

In den eigenen Methoden von Account

In einer Methode von Savings

Außerhalb, mit Punkt

Außerhalb, mit String-Schlüssel

Außerhalb, mit neuer Wertzuweisung

Offen für die Klasse und ihre Unterklassen. Ein String-Schlüssel kommt trotzdem an der Prüfung vorbei, weil es nur eine Typregel ist.

In den eigenen Methoden von Account

In einer Methode von Savings

Außerhalb, mit Punkt

Außerhalb, mit String-Schlüssel

Außerhalb, mit neuer Wertzuweisung

Sogar für Unterklassen gesperrt, aber nur bei der Typprüfung. Die Klammer-Schreibweise kompiliert, und der Wert ist zur Laufzeit lesbar.

In den eigenen Methoden von Account

In einer Methode von Savings

Außerhalb, mit Punkt

Außerhalb, mit String-Schlüssel

Außerhalb, mit neuer Wertzuweisung

Ein privates JavaScript-Feld. Kein String-Schlüssel benennt es, daher scheitert jeder Weg von außen, und die Engine erzwingt dieselbe Regel zur Laufzeit.

In den eigenen Methoden von Account

In einer Methode von Savings

Außerhalb, mit Punkt

Außerhalb, mit String-Schlüssel

Außerhalb, mit neuer Wertzuweisung

Jeder darf es lesen; niemand darf es nach der Konstruktion zuweisen, nicht einmal die eigenen Methoden der Klasse.

In den eigenen Methoden von Account

In einer Methode von Savings

Außerhalb, mit Punkt

Außerhalb, mit String-Schlüssel

Außerhalb, mit neuer Wertzuweisung

Matrix für Member-Zugriff

Modifier wählen

Zugriff auf ein {v}-Member

Verwendet von

Code

tsc-Ergebnis

Kompiliert

Kostenlos starten · Keine Kreditkarte nötig

Verwandt: Ratgeber

Produkt

Für wen

Funktionen

Ressourcen

Unternehmen

Sitemap