Parametertypen
Im JavaScript-Kurs hast du Funktionen wie diese geschrieben. Sie addiert das Leben, das ein Trank heilt, zum Leben eines Helden:
function heilen(leben, menge) {
return leben + menge;
}
console.log(heilen(30, 20));
console.log(heilen(45, "5"));In JavaScript gibt sie 50 und dann 455 aus. Der zweite Aufruf übergibt den Text "5", und + mit einem Text verbindet, statt zu addieren. Der Held hat plötzlich 455 Leben, und niemand bemerkt es bis viel später.
In TypeScript läuft dieses Programm gar nicht. Der Compiler meldet:
main.ts(1,17): error TS7006: Parameter 'leben' implicitly has an 'any' type.
main.ts(1,24): error TS7006: Parameter 'menge' implicitly has an 'any' type.TypeScript kann den Typ einer Variablen aus ihrem Wert ableiten, aber ein Parameter hat in der Funktion selbst keinen Wert. Er bekommt erst einen, wenn die Funktion aufgerufen wird, und jeder Aufruf kann etwas anderes übergeben. TypeScript weiß also nicht, was leben ist, und müsste ihm den Typ any geben, der die Prüfung ausschaltet, wie du aus der vorigen Lektion weißt. Das sagt die Meldung: Der Parameter hat implizit (ohne dass du es sagst) den Typ any. TypeScript erlaubt das nicht und bittet dich, den Typ selbst zu schreiben.
Den Typ eines Parameters schreibst du genau wie den Typ einer Variablen, mit einem Doppelpunkt und dem Typ hinter seinem Namen:
function heilen(leben: number, menge: number) {
return leben + menge;
}
console.log(heilen(30, 20));
console.log(heilen(45, "5"));main.ts(6,24): error TS2345: Argument of type 'string' is not assignable to parameter of type 'number'.Jetzt weiß TypeScript, was die Funktion braucht, und prüft jeden Aufruf. Diese Meldung kennst du aus der Übung zu Arrays in der vorigen Lektion, wo push einen falschen Wert bekam: push ist ebenfalls eine Funktion, deren Parameter einen Typ hat. Spalte 24 zeigt genau auf das Argument "5". Es ist ein string, aber der Parameter menge ist eine number. Ändere es in 5, und das Programm gibt zweimal 50 aus.
Die Typen helfen auch innerhalb der Funktion. TypeScript weiß, dass leben eine Zahl ist, deshalb wäre leben.toUpperCase() im Rumpf der Funktion ein Fehler, genau wie bei einer Variablen.
Typische Fehler:
- Ein Typ nur für einen Teil der Parameter. Bei
function heilen(leben, menge: number)hatlebenweiterhin keinen Typ, und du bekommst dafür TS7006. Jeder Parameter braucht seinen eigenen Typ, auch wenn alle denselben haben. =statt eines Doppelpunkts.function heilen(leben = number, menge = number)ergibt'number' only refers to a type, but is being used as a value here.Nach=kommt ein Standardwert, wie du aus dem JavaScript-Kurs weißt, undnumberist ein Typ, kein Wert.
So schreibst du es:
Anweisungen
- 1
Gib beiden Parametern von
heilenden Typnumber. Führe das Programm aus: TypeScript findet jetzt den Fehler in der letzten Zeile. Behebe ihn: Der Trank heilt 5 Leben, übergib also die Zahl5statt des Textes"5". - 2
Schreibe unter
heileneine FunktionbeschreibeHeldmit zwei Parametern:namevom Typstringundstufevom Typnumber. Sie gibt einen Text wieKira, Stufe 3zurück. - 3
Gib am Ende des Programms
beschreibeHeld("Kira", 3)aus. Das Programm gibt aus:50 50 Kira, Stufe 3