switch auf art
Wenn eine Union mehr als zwei Arten hat, werden Ketten aus if und else if lang. JavaScript hat eine Anweisung, die dafür gemacht ist, anhand eines Werts auszuwählen: switch. Sie ist neu für dich, hier siehst du, wie sie funktioniert, zuerst an einer Literal-Union aus Richtungen:
type Richtung = "norden" | "sueden" | "osten" | "westen";
function gehe(richtung: Richtung): void {
switch (richtung) {
case "norden":
console.log("Du gehst zu den Bergen");
break;
case "osten":
console.log("Du gehst zum Meer");
break;
default:
console.log("Du bleibst im Dorf");
break;
}
}
gehe("osten");
gehe("westen");Das gibt aus:
Du gehst zum Meer
Du bleibst im Dorfswitch nimmt den Wert in den Klammern, hier richtung, und vergleicht ihn mit === mit dem Wert hinter jedem case. Es springt zum ersten passenden case und führt die Anweisungen darunter aus. break beendet das switch: Das Programm geht hinter der schließenden Klammer weiter. default fängt jeden Wert ab, der keinen eigenen case hat, wie ein else am Ende einer if-Kette. Es ist optional und steht meist am Ende.
Gib auf break acht. Ohne es hält das Programm beim nächsten case nicht an: Es rutscht durch (englisch falls through) und führt auch die Anweisungen der folgenden Fälle aus, bis es ein break oder das Ende des switch erreicht. Mit den Gegenständen aus der vorigen Übung:
function benutze(gegenstand: Gegenstand): void {
switch (gegenstand.art) {
case "trank":
console.log(`Du trinkst: ${gegenstand.name}`);
case "waffe":
console.log(`Du ziehst: ${gegenstand.name}`);
break;
}
}
benutze({ art: "trank", name: "Heiltrank", heilung: 20 });Das gibt aus:
Du trinkst: Heiltrank
Du ziehst: HeiltrankTypeScript meldet ein fehlendes break nicht. Wenn ein switch mehr tut, als er soll, such also nach einem.
In einer Funktion beendet auch return das switch (es beendet die ganze Funktion), ein case mit return braucht also kein break. Und bei einer diskriminierten Union grenzt jeder case den Typ ein, genau wie ein if:
function wert(gegenstand: Gegenstand): number {
switch (gegenstand.art) {
case "trank":
return gegenstand.heilung * 2;
case "waffe":
return gegenstand.schaden * 5;
}
}
for (const gegenstand of inventar) {
console.log(`${gegenstand.name}: ${wert(gegenstand)} Gold`);
}Mit dem Inventar aus der vorigen Übung gibt das aus:
Heiltrank: 40 Gold
Silberschwert: 60 GoldIn case "trank": ist der Gegenstand ein Trank, also ist gegenstand.heilung erlaubt; gegenstand.schaden wäre dort error TS2339: Property 'schaden' does not exist on type 'Trank'. Beachte auch, dass nach dem switch kein return steht und TypeScript das nicht stört: Es weiß, dass die zwei Fälle jede Art von Gegenstand abdecken. Mehr dazu in der nächsten Übung.
TypeScript prüft auch die Werte hinter case. Mit einem Tippfehler:
type Trank = { art: "trank"; name: string; heilung: number };
type Waffe = { art: "waffe"; name: string; schaden: number };
type Gegenstand = Trank | Waffe;
function benutze(gegenstand: Gegenstand): void {
switch (gegenstand.art) {
case "trnak":
console.log(`Du trinkst: ${gegenstand.name}`);
break;
case "waffe":
console.log(`Du ziehst: ${gegenstand.name}`);
break;
}
}main.ts(7,14): error TS2678: Type '"trnak"' is not comparable to type '"trank" | "waffe"'.
main.ts(8,51): error TS2339: Property 'name' does not exist on type 'never'.Der erste Fehler sagt, dass "trnak" nicht die Art eines Gegenstands sein kann. Der zweite ist seine Folge: In einem case, der nie zutreffen kann, hat der Gegenstand den Typ never, den Typ eines Werts, der nicht existieren kann. Auf never triffst du in der nächsten Übung wieder.
So schreibst du es:
Anweisungen
- 1
Schreibe
beschreibemitswitch (gegenstand.art)um, mit einemcasefür jede Art, der ihre Beschreibung zurückgibt. Das Programm gibt dieselben zwei Zeilen aus wie vorher. - 2
Kira hat einen Schlüssel gefunden. Füge der Union
Gegenstandeine dritte Art von Gegenstand hinzu,type Schluessel = { art: "schluessel"; name: string; oeffnet: string };, füge demswitcheinencasedafür hinzu und füge{ art: "schluessel", name: "Alter Schlüssel", oeffnet: "die Gruft" }am Ende des Inventars hinzu. Das Programm gibt dann aus:Heiltrank (heilt 20) Silberschwert (Schaden 12) Alter Schlüssel (öffnet die Gruft)