Typinferenz
In den vorigen Übungen hast du TypeScript nie gesagt, dass traenke eine Zahl enthält oder dass der Held eine Eigenschaft leben hat. TypeScript hat es selbst aus den Werten herausgefunden. Das heißt Typinferenz: TypeScript leitet (englisch infer) den Typ jeder Variablen aus dem Wert ab, den du ihr gibst.
Für einfache Werte hat TypeScript drei Basistypen. Ihre Namen sind dieselben, die typeof in JavaScript liefert:
string: ein Text, zum Beispiel"Kira"oder"".number: jede Zahl, ganz oder mit Nachkommastellen, zum Beispiel120,-5oder2.5. TypeScript hat einen einzigen Typ für alle Zahlen.boolean:trueoderfalse.
let heldenName = "Kira"; // string
let gold = 120; // number
let hatKarte = false; // booleanTypeScript leitet auch die Typen von Objekten und Arrays ab. Für { name: "Kira", leben: 50 } ist der Typ { name: string; leben: number; }, wie du es in einer Fehlermeldung der vorigen Übung gesehen hast. Mehr zu solchen Typen erfährst du in den nächsten Lektionen.
Der Typ entscheidet, was du mit einem Wert tun darfst. Ein Text hat eine Länge und lässt sich in Großbuchstaben umwandeln, eine Zahl kann beides nicht:
let heldenName = "Kira";
let gold = 120;
console.log(heldenName.toUpperCase());
console.log(gold.toUpperCase());main.ts(5,18): error TS2339: Property 'toUpperCase' does not exist on type 'number'.toUpperCase() ist eine Methode von Texten, deshalb erlaubt TypeScript sie bei heldenName, das ein string ist. Bei gold, das eine number ist, meldet es, dass der Typ number keine solche Eigenschaft hat. (Eine Methode ist eine Eigenschaft, deren Wert eine Funktion ist, deshalb spricht die Meldung von einer Eigenschaft.) Als JavaScript würde dieses Programm KIRA ausgeben und dann mit TypeError: gold.toUpperCase is not a function abstürzen, aber erst, wenn es bei dieser Zeile ankäme. Stünde die Zeile in einem if, das nur hin und wieder läuft, könnte der Fehler wochenlang unentdeckt bleiben. TypeScript prüft jede Zeile, auch die, die diesmal nicht laufen.
Noch etwas fällt dir vielleicht auf: Bei const gold = 120; würde die Meldung den Typ '120' statt 'number' nennen. Es ist ebenfalls eine Zahl, nur eine genaue, weil eine Konstante sich nie ändert. Mehr dazu erfährst du in der nächsten Lektion.
Typische Fehler:
- Eine Methode von Texten, die auf eine Zahl angewendet wird, wie oben, oft weil zwei Variablen verwechselt wurden.
- Die Länge einer Zahl:
gold.lengthergibtProperty 'length' does not exist on type 'number'.Texte und Arrays haben eine Länge, Zahlen nicht.
So schreibst du es:
Anweisungen
- 1
Der Charakterbogen im Editor soll Kiras Klasse in Großbuchstaben ausgeben, aber eine Variable wurde verwechselt. Führe das Programm aus, finde den Fehler anhand der Fehlermeldung und behebe ihn, sodass das Programm ausgibt:
Name: KIRA Klasse: WALDLÄUFERIN Gold: 120 - 2
Gib am Ende des Programms mit dem
typeofvon JavaScript die Typen der drei Variablen aus, in der ReihenfolgeheldenName,heldenKlasse,gold. Es sind dieselben Typen, die TypeScript abgeleitet hat. Das Programm gibt dann zusätzlich aus:Typen: string string number