Schreibgeschützte Felder
Manche Werte sollten sich nicht mehr ändern, sobald ein Objekt existiert: der Name eines Helden, die Nummer eines Quests, eine ID in einem Spielstand. In der Lektion Objekttypen hast du solche Eigenschaften als readonly markiert, und Felder einer Klasse funktionieren genauso:
class Held {
readonly id: number;
readonly name: string;
stufe: number = 1;
constructor(id: number, name: string) {
this.id = id;
this.name = name;
}
benenneUm(neuerName: string): void {
this.name = neuerName;
}
}
const kira = new Held(1, "Kira");
kira.name = "Kiraa";TypeScript meldet:
main.ts(12,14): error TS2540: Cannot assign to 'name' because it is a read-only property.
main.ts(17,6): error TS2540: Cannot assign to 'name' because it is a read-only property.Ein readonly-Feld bekommt seinen Wert entweder als Anfangswert oder im Konstruktor, und nur dort kann es zugewiesen werden. Danach kann es niemand mehr ändern: nicht der Code außerhalb der Klasse und nicht einmal die eigenen Methoden der Klasse, wie benenneUm oben. Lesen ist überall erlaubt: kira.name ist in Ordnung.
readonly oder private? Sie schützen verschiedene Dinge:
privatebetrifft, wer das Feld verwenden darf: Nur die Klasse kann es lesen und ändern.readonlybetrifft, wann es sich ändern darf: nur während das Objekt erzeugt wird. Jeder kann es lesen.
Du kannst beides kombinieren: private readonly geheimnis: string; ist ein Feld, das nur die Klasse lesen kann und das sich nie ändert. Und im Vergleich mit const: const ist für Variablen, readonly für Felder und Eigenschaften.
Wie private gibt es readonly nur für TypeScript; das JavaScript, das läuft, hat eine gewöhnliche Eigenschaft. Aber weil TypeScript das ganze Programm prüft, bevor es läuft, kann keine Zeile deines Programms das Feld ändern.
Ein schreibgeschütztes Feld fängt mehr ab als absichtliche Änderungen. Erinnerst du dich an den klassischen Fehler aus dem JavaScript-Kurs, = statt === in einer Bedingung? Das Programm im Editor hat ihn.
So schreibst du es:
Anweisungen
- 1
Führe das Programm aus: Es gibt
Bruno ist da!aus, und Kira heißt plötzlich Bruno. Mache die Felderidundnameschreibgeschützt. TypeScript meldet dann die Zeile mit dem Fehler; behebe ihn, sodass sie den Namen vergleicht, statt ihn zuzuweisen. Kira bleibt Kira:Held { id: 1, name: "Kira", stufe: 2 } - 2
Füge nach
nameein drittes schreibgeschütztes Feld hinzu:heldenKlassevom TypHeldenKlasse(der Typ steht oben im Programm). Der Konstruktor bekommt es als dritten Parameter. Erzeuge Kira als Waldläuferin,new Held(1, "Kira", "Waldläuferin"). Das Programm gibt dann aus:Held { id: 1, name: "Kira", heldenKlasse: "Waldläuferin", stufe: 2 }