Aufträge
Jetzt Kiras Auftragsbuch. Jeder Auftrag hat einen Titel und ist offen, erledigt oder gescheitert. Wir haben Kiras Aufträge unter ihr in die Daten gesetzt. Jeder Status hat eigene Daten: Nur ein erledigter Auftrag hat eine belohnung, und nur ein gescheiterter hat den grund, warum er gescheitert ist. Das ist die Form aus der Lektion „Daten modellieren“, in der unmögliche Kombinationen gar nicht geschrieben werden können: eine Union mit einem Tag, diesmal status genannt. Zum Beispiel Bestellungen in einem Laden:
type Bestellung =
| { status: "wartend"; ware: string }
| { status: "versendet"; ware: string; tage: number }
| { status: "storniert"; ware: string; grund: string };
function beschreibeBestellung(bestellung: Bestellung): string {
switch (bestellung.status) {
case "wartend":
return `${bestellung.ware}: wartet`;
case "versendet":
return `${bestellung.ware}: kommt in ${bestellung.tage} Tagen an`;
case "storniert":
return `${bestellung.ware}: storniert, ${bestellung.grund}`;
}
}
const bestellungen: Bestellung[] = [
{ status: "versendet", ware: "Seil", tage: 2 },
{ status: "storniert", ware: "Laterne", grund: "nicht vorrätig" },
];
for (const bestellung of bestellungen) {
console.log(beschreibeBestellung(bestellung));
}Das gibt aus:
Seil: kommt in 2 Tagen an
Laterne: storniert, nicht vorrätigDieses switch hat keinen default mit der never-Prüfung und braucht auch keinen: Der Rückgabetyp string erledigt die Aufgabe. Hätte ein Status keinen case, könnte die Funktion enden, ohne etwas zurückzugeben, und TypeScript würde ihre erste Zeile melden: Function lacks ending return statement and return type does not include 'undefined'. Beide Wege sind üblich: Die Vollständigkeitsprüfung nennt auch den vergessenen Typ, und der Rückgabetyp allein ist kürzer.
Die Aufträge in den Daten haben noch keinen Typ, TypeScript hat also einen aus den Objekten abgeleitet. Sobald du das Array mit Auftrag[] annotierst, prüft TypeScript jeden Auftrag gegen die Union. Ein erledigter Auftrag ohne Belohnung zum Beispiel würde gemeldet:
main.ts(99,5): error TS2322: Type '{ status: "erledigt"; titel: string; }' is not assignable to type 'Auftrag'.
Property 'belohnung' is missing in type '{ status: "erledigt"; titel: string; }' but required in type '{ status: "erledigt"; titel: string; belohnung: number; }'.So schreibst du es:
Anweisungen
- 1
Schreibe unter
Heldden TypAuftrag: eine Union aus drei Objekttypen, jeder mit einemtitel(ein Text) und einemstatus. Ein offener Auftrag hatstatus: "offen"; ein erledigterstatus: "erledigt"und einebelohnung(eine Zahl); und ein gescheiterterstatus: "gescheitert"und einengrund(ein Text). Annotiere dann das ArrayauftraegemitAuftrag[]. - 2
Schreibe unter
findeNachNameeine FunktionbeschreibeAuftrag(auftrag: Auftrag): stringmit einemswitchaufauftrag.status. Für einen offenen Auftrag gibt sie[offen] Die verlorene Kronezurück, für einen erledigten[erledigt] Wölfe im Wald: +50 Goldund für einen gescheiterten[gescheitert] Rettet den Müller: die Mühle ist abgebrannt. - 3
Gib am Ende des Hauptprogramms
Aufträge:aus und danach jeden Auftrag in einerfor...of-Schleife. Das Programm endet so:Aufträge: [erledigt] Wölfe im Wald: +50 Gold [offen] Die verlorene Krone [gescheitert] Rettet den Müller: die Mühle ist abgebrannt [erledigt] Die Goblin-Brücke: +30 Gold