Gegenstände benutzen
Gegenstände sind dazu da, benutzt zu werden: Ein Trank heilt Kira, eine Waffe kommt in ihre Hand, und ein Schlüssel öffnet etwas. Einen Gegenstand zu benutzen verändert den Helden, also bekommt die Funktion ihn als Parameter und ändert seine Eigenschaften. Objekte werden nicht kopiert, wenn du sie an eine Funktion übergibst, deshalb passieren die Änderungen an kira selbst.
Wo hält Kira die Waffe in der Hand? In einer neuen Eigenschaft, waffe. Zu Beginn des Abenteuers ist ihre Hand leer, deshalb ist die Eigenschaft optional, wie in der Lektion „Objekttypen“: waffe?: Waffe. Zum Beispiel eine Waldläuferin und ihr Haustier:
type Haustier = { name: string; tierart: string };
interface Waldlaeufer {
name: string;
haustier?: Haustier;
}
function adoptiere(waldlaeufer: Waldlaeufer, haustier: Haustier): string {
waldlaeufer.haustier = haustier;
return `${waldlaeufer.name} adoptiert ${haustier.name} (${haustier.tierart})`;
}
const ema: Waldlaeufer = { name: "Ema" };
console.log(ema.haustier?.name ?? "kein Haustier");
console.log(adoptiere(ema, { name: "Schatten", tierart: "Wolf" }));
console.log(ema.haustier?.name ?? "kein Haustier");Das gibt aus:
kein Haustier
Ema adoptiert Schatten (Wolf)
SchattenbenutzeGegenstand ist ein switch auf gegenstand.art, wie beschreibeGegenstand, aber einige Fälle ändern zuerst den Helden und geben erst dann den Text zurück:
- Der Trank addiert
gegenstand.heilungzu ihrem Leben. Ist das mehr alsmaxLeben, wird das Leben aufmaxLebengesetzt: Kira hat 34 Leben, der Trank heilt 20, und 54 wäre mehr als ihre 50. - Die Waffe kommt in ihre Hand:
held.waffe = gegenstand;. Das funktioniert nur innerhalb voncase "waffe", wo TypeScript weiß, dass der Gegenstand eineWaffeist. Über demswitchkönnte der Gegenstand jede Art sein, und TypeScript würde melden:main.ts(46,5): error TS2322: Type 'Gegenstand' is not assignable to type 'Waffe | undefined'. Property 'schaden' is missing in type 'Schluessel' but required in type 'Waffe'. - Der Schlüssel ändert nichts; er gibt nur
Kira öffnet die Gruftzurück.
Schreibe auch hier den Rückgabetyp string. TypeScript prüft dann, dass jeder case einen Text zurückgibt. Und wie du im letzten Schritt sehen wirst, meldet es auch eine Art von Gegenstand ohne case, selbst ohne die never-Prüfung: Die Funktion würde enden, ohne einen Text zurückzugeben.
Im Hauptprogramm ist kira.inventar[0] der erste Gegenstand (der Trank) und kira.inventar[1] der zweite (das Schwert). Kiras name ist schreibgeschützt, das ist aber in Ordnung: benutzeGegenstand liest ihn nur.
So schreibst du es:
Anweisungen
- 1
Füge
Heldeine optionale Eigenschaftwaffevom TypWaffehinzu. - 2
Schreibe unter
beschreibeGegenstandeine FunktionbenutzeGegenstand(held: Held, gegenstand: Gegenstand): stringmit einemswitchaufgegenstand.art. Für den Trank gibt sieKira trinkt Heiltrank: Leben 50/50zurück (der Name des Helden, der Name des Gegenstands und das neue Leben), für die WaffeKira rüstet Silberschwert ausund für den SchlüsselKira öffnet die Gruft. - 3
Kira benutzt am Ende des Hauptprogramms ihre ersten beiden Gegenstände: Gib
benutzeGegenstand(kira, kira.inventar[0])undbenutzeGegenstand(kira, kira.inventar[1])aus. Das Programm endet so:- Alter Schlüssel (öffnet die Gruft) Kira trinkt Heiltrank: Leben 50/50 Kira rüstet Silberschwert ausHat Kira
54/50, hat der Trank sie über ihr Maximum hinaus geheilt.