Klassen und new
Bisher hast du Objekte erzeugt, indem du sie ausgeschrieben hast, { name: "Goblin", leben: 30 }, oder mit einer Funktion, die eines zurückgibt. Wenn ein Spiel viele Objekte derselben Art braucht, hat JavaScript einen anderen Weg: eine Klasse. Eine Klasse ist eine Vorlage für Objekte. Sie sagt einmal, was jedes Objekt haben wird, das daraus entsteht:
class Monster {
name: string = "Goblin";
leben: number = 30;
}
const goblin = new Monster();
const wolf = new Monster();
wolf.name = "Wolf";
console.log(goblin);
console.log(wolf);Das gibt aus:
Monster { name: "Goblin", leben: 30 }
Monster { name: "Wolf", leben: 30 }Schritt für Schritt:
class Monster { … }deklariert eine Klasse namensMonster. Klassennamen beginnen mit einem Großbuchstaben, wie die Namen von Typen.- In der Klasse stehen ihre Felder: die Eigenschaften, die jedes Objekt der Klasse haben wird. Ein Feld wird wie eine Eigenschaft in einem Objekttyp geschrieben, mit Namen und Typ, gefolgt von
=und seinem Anfangswert. Jedes Feld endet mit;. new Monster()erzeugt aus der Vorlage ein neues Objekt, dessen Felder ihre Anfangswerte haben. Ein solches Objekt ist eine Instanz der Klasse. Jedesnewerzeugt ein eigenes Objekt, deshalb ändert sichgoblinnicht, wenn duwolf.nameänderst.console.logschreibt den Namen der Klasse vor das Objekt, sodass du siehst, woraus das Objekt entstanden ist.
Klassen sind Teil von JavaScript; TypeScript fügt die Typen der Felder hinzu. Wie bei Variablen kannst du den Typ weglassen, wenn es einen Anfangswert gibt: leben = 30; ist eine number.
Eine Klasse ist auch ein Typ. Du kannst den Namen Monster in Annotationen verwenden, wie die Typen aus der Lektion Objekttypen: const endgegner: Monster = new Monster(); oder function treffe(monster: Monster): void. TypeScript prüft Felder wie Eigenschaften: goblin.lebn ergibt Property 'lebn' does not exist on type 'Monster'. Did you mean 'leben'? (TS2551), und goblin.leben = "viel"; ist TS2322.
Jedes Feld braucht einen Wert. Lässt du einen Anfangswert weg, bekommst du einen Fehler:
class Monster {
name: string = "Goblin";
leben: number;
}TypeScript meldet:
main.ts(3,5): error TS2564: Property 'leben' has no initializer and is not definitely assigned in the constructor.Ohne diese Prüfung hätte ein neues Monster undefined in leben, obwohl sein Typ number sagt. Die Meldung erwähnt den Konstruktor, die andere Möglichkeit, einem Feld seinen Wert zu geben; das ist die nächste Übung.
Typische Fehler:
newvergessen:const goblin = Monster();ergibtValue of type 'typeof Monster' is not callable. Did you mean to include 'new'?(TS2348).- Ein Feld wie die Eigenschaft eines Objektliterals schreiben:
name: "Goblin";. Nach einem Doppelpunkt kommt ein Typ, also wird"Goblin"zum Literaltyp des Feldes, das Feld bekommt keinen Wert, und du erhältst TS2564. Der Wert kommt hinter=. - Felder mit Kommas trennen, wie in einem Objekt: TypeScript meldet
';' expected.(TS1005).
So schreibst du es:
Anweisungen
- 1
Deklariere eine Klasse
Monstermit zwei Feldern:name, einstringmit dem Anfangswert"Goblin", undleben, einenumbermit dem Anfangswert30. - 2
Erzeuge unter der Klasse mit
newzwei Monster:goblinundwolf. Ändere dennamedes Wolfs in"Wolf"und seinlebenin25. Gib dann beide Monster aus:Monster { name: "Goblin", leben: 30 } Monster { name: "Wolf", leben: 25 } - 3
Schreibe eine Funktion
treffe(monster: Monster, schaden: number): void, die das Leben des Monsters umschadensenkt. Rufe am Ende des Programmstreffe(wolf, 10)auf und gib Namen und Leben des Wolfs so aus:Wolf: 15