Verschachtelte Objekte
Eine Eigenschaft kann ein weiteres Objekt enthalten. Ein Held hat eine Position auf der Karte, mit x und y. Der Typ einer solchen Eigenschaft ist ebenfalls ein Objekttyp:
type Held = {
name: string;
position: { x: number; y: number };
};
const kira: Held = { name: "Kira", position: { x: 3, y: 4 } };
kira.position.x = kira.position.x + 1;
console.log(kira);
console.log(kira.position.x);Das gibt aus:
{ name: "Kira", position: { x: 4, y: 4 } }
4Lies kira.position.x von links nach rechts: Von kira nimm position, ein Objekt mit x und y, und davon x, eine Zahl. TypeScript prüft das innere Objekt genauso sorgfältig wie das äußere.
Meist ist es besser, dem inneren Typ einen eigenen Namen zu geben. Die Typen werden kürzer, du kannst die Position woanders verwenden (ein Monster hat auch eine, und ein Schatz ebenso), und die Fehlermeldungen werden klarer. Vergleiche denselben Fehler, eine Position ohne y, zuerst mit dem Typ innerhalb von Held:
type Held = { name: string; position: { x: number; y: number } };
const kira: Held = { name: "Kira", position: { x: 3 } };main.ts(3,36): error TS2741: Property 'y' is missing in type '{ x: number; }' but required in type '{ x: number; y: number; }'.und dann mit einem eigenen Typ Position:
type Position = { x: number; y: number };
type Held = { name: string; position: Position };
const kira: Held = { name: "Kira", position: { x: 3 } };main.ts(4,36): error TS2741: Property 'y' is missing in type '{ x: number; }' but required in type 'Position'.Achte auch auf die Spalte. Sie zeigt auf position, die Eigenschaft mit dem inneren Objekt, und nicht auf den Anfang von kira. Wenn tief in einem Objekt etwas nicht stimmt, zeigt dir TypeScript, wo. Das Lesen einer Eigenschaft, die es nicht gibt, wird mit dem Namen des inneren Typs gemeldet:
type Position = { x: number; y: number };
type Held = { name: string; position: Position };
const kira: Held = { name: "Kira", position: { x: 3, y: 4 } };
console.log(kira.position.z);main.ts(5,27): error TS2339: Property 'z' does not exist on type 'Position'.Eine Eigenschaft kann auch ein Array enthalten. Das Inventar eines Helden könnte inventar: string[] sein, eine Liste von Gegenstandsnamen, oder mit einem Typ Gegenstand inventar: Gegenstand[], eine Liste ganzer Objekte. Alles, was du über Arrays und Objekte weißt, gilt auch dort: kira.inventar.push("Seil"), kira.inventar.length oder eine for...of-Schleife über kira.inventar.
So schreibst du es:
Anweisungen
- 1
Erstelle einen Typ
Waffefür Kiras Waffe mit den Eigenschaftennamevom Typstringundschadenvom Typnumber. - 2
Erstelle einen Typ
Heldmit den Eigenschaftenname(einstring),position(einePosition) undwaffe(eineWaffe) und annotierekiradamit. - 3
Kira geht 3 Schritte nach Osten: Erhöhe am Ende des Programms
kira.position.xum 3. Gib dann die folgende Zeile aus, mit den Werten auskira.position:Kira steht auf 5, 5 - 4
In einer Truhe findet Kira einen besseren Bogen. Lege ein neues Waffenobjekt in
kira.waffe: einen Elfenbogen mit Schaden 12. Gib dann die folgende Zeile aus, mit den Werten auskira.waffe:Kira führt Elfenbogen (12 Schaden)