Der Bericht
Am Ende des Abenteuers kommt ein Bericht: wie viele Aufträge erledigt, offen und gescheitert sind, und Kiras Gold, mit den Belohnungen der erledigten Aufträge dazu.
Zum Zählen brauchst du für jeden Status eine Zahl: ein Objekt mit einem Schlüssel pro Status, wofür Record aus der Lektion „Daten modellieren“ da ist. Und du musst die Status nicht noch einmal schreiben: Auftrag["status"] aus der vorigen Lektion ist die Union aller Status. Zum Beispiel Monster in einer Höhle, gezählt nach ihrer Art:
type Monster = { art: "goblin" | "wolf" | "troll"; name: string };
const hoehle: Monster[] = [
{ art: "goblin", name: "Grub" },
{ art: "wolf", name: "Grau" },
{ art: "goblin", name: "Zack" },
];
const anzahlen: Record<Monster["art"], number> = { goblin: 0, wolf: 0, troll: 0 };
for (const monster of hoehle) {
anzahlen[monster.art]++;
}
console.log(anzahlen);
console.log(`Goblins: ${anzahlen.goblin}`);Das gibt aus:
{ goblin: 2, wolf: 1, troll: 0 }
Goblins: 2anzahlen[monster.art] verwendet die Art als Schlüssel, sodass jedes Monster eins zu seiner eigenen Anzahl addiert. TypeScript prüft, dass das Objekt jeden Schlüssel hat. In deinem Programm bekämst du ohne gescheitert: 0 main.ts(122,7): error TS2741: Property 'gescheitert' is missing in type '{ offen: number; erledigt: number; }' but required in type 'Record<"erledigt" | "gescheitert" | "offen", number>'. Und wenn irgendwann ein neuer Status zu Auftrag hinzukommt, meldet TypeScript auch dieses Objekt.
Nun das Gold. Nur ein erledigter Auftrag hat eine Belohnung, deshalb ist es ein Fehler, auftrag.belohnung ohne Prüfung zu lesen:
main.ts(126,37): error TS2339: Property 'belohnung' does not exist on type 'Auftrag'.
Property 'belohnung' does not exist on type '{ status: "offen"; titel: string; }'.Innerhalb von if (auftrag.status === "erledigt") grenzt TypeScript den Auftrag auf einen erledigten ein, und auftrag.belohnung ist in Ordnung. Kira steckt in einer const, aber ihr Gold kannst du trotzdem ändern: const bedeutet nur, dass die Variable immer dasselbe Objekt enthält.
So schreibst du es:
Anweisungen
- 1
Erstelle im Hauptprogramm über der Schleife über die Aufträge eine Konstante
anzahlenvom TypRecord<Auftrag["status"], number>mit einer0für jeden Status. - 2
Addiere in der Schleife für den Status jedes Auftrags eins zur Anzahl. Gib die Anzahlen nach der Schleife aus:
Erledigt: 2, offen: 1, gescheitert: 1 - 3
Addiere in derselben Schleife die Belohnung jedes erledigten Auftrags zu Kiras Gold. Gib ganz am Ende die Zeile über Kira noch einmal aus. Das Programm endet so:
Erledigt: 2, offen: 1, gescheitert: 1 Kira (Waldläufer), Stufe 3, Leben 50/50, Gold 200Kira hat ihr Leben vom Trank und ihr Gold von zwei Aufträgen. Hat sie noch 120 Gold, gibst du sie vor der Schleife aus.