Objekte in Funktionen
Objekttypen sind in Funktionen am nützlichsten, als Parametertypen und Rückgabetypen. Die erste Zeile einer Funktion erzählt dann die ganze Geschichte: was die Funktion bekommt und was sie zurückgibt.
Eine Funktion, die Objekte einer Form erzeugt, oft Fabrik (englisch factory) genannt, bekommt den Typ als Rückgabetyp. TypeScript prüft dann das Objekt, das sie zurückgibt:
interface Monster {
name: string;
stufe: number;
leben: number;
}
function erzeugeMonster(name: string, stufe: number): Monster {
return { name: name, leben: stufe * 10 };
}main.ts(8,5): error TS2741: Property 'stufe' is missing in type '{ name: string; leben: number; }' but required in type 'Monster'.Ohne den Rückgabetyp würde die Funktion ein Monster ohne stufe zurückgeben, und der Fehler würde erst später auftauchen, überall dort, wo die Stufe eines Monsters gelesen wird. Mit ihm meldet TypeScript das return selbst.
Hier ist die funktionierende Version, zusammen mit einer Funktion, die ein Monster verändert:
interface Monster {
name: string;
stufe: number;
leben: number;
}
function erzeugeMonster(name: string, stufe: number): Monster {
return { name: name, stufe: stufe, leben: stufe * 10 };
}
function reize(monster: Monster): void {
monster.stufe = monster.stufe + 2;
}
const wolf = erzeugeMonster("Wolf", 3);
reize(wolf);
console.log(wolf);Das gibt aus:
{ name: "Wolf", stufe: 5, leben: 30 }wolf bekommt den Typ Monster vom Rückgabetyp der Funktion, ohne Annotation. reize verändert genau das Objekt, das du übergibst, nicht eine Kopie, die Änderung ist also auch außerhalb der Funktion sichtbar, so wie erhoeheStufe in der Übung zu schreibgeschützten Eigenschaften Kiras Stufe verändert hat. Ihr Rückgabetyp ist void: Sie gibt nichts zurück, die Änderung ist ihr Ergebnis.
Die Aufrufe werden wie bei jedem anderen Parametertyp geprüft:
interface Monster {
name: string;
stufe: number;
leben: number;
}
function reize(monster: Monster): void {
monster.stufe = monster.stufe + 2;
}
reize("Wolf");
reize({ name: "Troll", stufe: 4, leben: 40, wuetend: true });main.ts(11,7): error TS2345: Argument of type 'string' is not assignable to parameter of type 'Monster'.
main.ts(12,45): error TS2353: Object literal may only specify known properties, and 'wuetend' does not exist in type 'Monster'.Der erste Aufruf übergibt einen Text statt eines Monsters. Der zweite übergibt ein Objektliteral mit einer überflüssigen Eigenschaft, wie in der Übung zu überflüssigen Eigenschaften.
Typische Fehler:
- Eine Eigenschaft fehlt im zurückgegebenen Objekt:
Property 'stufe' is missing in type ..., gemeldet beimreturn. - Etwas anderes als das Objekt zu übergeben, etwa den Namen des Monsters:
Argument of type 'string' is not assignable to parameter of type 'Monster'.
So schreibst du es:
Anweisungen
- 1
Schreibe eine Funktion
erzeugeMonstermit den Parameternname(einstring) undstufe(einenumber) und dem RückgabetypMonster. Sie gibt ein neues Monster mit diesem Namen und dieser Stufe zurück, mitlebengleichstufe * 10. - 2
Erstelle mit
erzeugeMonstereinenwolfder Stufe 2 und einentrollder Stufe 5. Gib beide mitbeschreibeaus. Das Programm gibt aus:Wolf: Stufe 2, 20 Leben Troll: Stufe 5, 50 Leben - 3
Schreibe eine Funktion
trainieremit einem Parametermonstervom TypMonsterund dem Rückgabetypvoid. Sie erhöht die Stufe des Monsters um 1 und sein Leben um 10. - 4
Trainiere den Wolf zweimal und gib ihn dann noch einmal mit
beschreibeaus. Am Ende gibt das Programm aus:Wolf: Stufe 4, 40 Leben