Funktionen, die nichts zurückgeben
Manche Funktionen geben nichts zurück. Sie tun nur etwas, zum Beispiel eine Zeile ausgeben. Ihr Rückgabetyp heißt void („Leere“):
function zeigeHeld(name: string, leben: number): void {
console.log(`${name}: ${leben} Leben`);
}
zeigeHeld("Kira", 50);
zeigeHeld("Bruno", 65);Das gibt aus:
Kira: 50 Leben
Bruno: 65 Leben: void sagt: Diese Funktion gibt keinen Wert zurück, du rufst sie wegen dem auf, was sie tut. Lässt du es weg, leitet TypeScript void selbst ab, aber wenn du es schreibst, ist deine Absicht klar, und TypeScript meldet ein return mit einem Wert, das aus Versehen hineingeraten ist:
function zeigeHeld(name: string, leben: number): void {
console.log(`${name}: ${leben} Leben`);
return leben;
}main.ts(3,5): error TS2322: Type 'number' is not assignable to type 'void'.Eine void-Funktion darf trotzdem return; ohne Wert verwenden, um früher zu enden.
In JavaScript gibt so eine Funktion undefined zurück, und nichts hindert dich daran, dieses „Ergebnis“ versehentlich zu verwenden. Am häufigsten passiert das, wenn eine Funktion einen Text ausgibt, den du eigentlich als Wert brauchst. Den Unterschied zwischen Ausgeben und Zurückgeben kennst du aus dem JavaScript-Kurs:
function heldenTitel(name: string, stufe: number) {
console.log(`${name} von Rabenfels, Stufe ${stufe}`);
}
const titel = heldenTitel("Kira", 3);
console.log(titel.toUpperCase());main.ts(6,19): error TS2339: Property 'toUpperCase' does not exist on type 'void'.In JavaScript würde dieses Programm den Titel ausgeben und dann mit TypeError: Cannot read properties of undefined (reading 'toUpperCase') abstürzen. TypeScript hält es auf, bevor es läuft: heldenTitel gibt void zurück, titel enthält also nichts, was sich verwenden ließe, und hat keine Eigenschaften. Die Lösung ist, heldenTitel den Text zurückgeben statt ausgeben zu lassen, mit dem Rückgabetyp string. Wer die Funktion aufruft, kann den Text dann ausgeben, in Großbuchstaben umwandeln oder an einen anderen anhängen.
Auch andere Verwendungen eines void-Ergebnisses sind Fehler, zum Beispiel in einer Bedingung:
function zeigeHeld(name: string, leben: number): void {
console.log(`${name}: ${leben} Leben`);
}
if (zeigeHeld("Kira", 50)) {
console.log("Ausgegeben!");
}main.ts(5,5): error TS1345: An expression of type 'void' cannot be tested for truthiness.console.log(zeigeHeld("Kira", 50)) kommt dagegen durch, weil console.log alles annimmt. Es gibt die Zeile und dann undefined aus: ein Zeichen dafür, dass du das Ergebnis einer Funktion ausgibst, die nichts zurückgibt.
Typische Fehler:
- Ein
returnmit einem Wert in einervoid-Funktion:Type 'number' is not assignable to type 'void'.Entweder soll die Funktion den Wert zurückgeben (dann ändere ihren Rückgabetyp), oder dasreturngehört nicht dorthin. - Ausgeben in einer Funktion, deren Ergebnis du brauchst. Braucht der Code, der die Funktion aufruft, den Wert, muss die Funktion ihn zurückgeben.
So schreibst du es:
Anweisungen
- 1
Die Funktion
auftragsNamegibt ihren Text aus, aber das Programm braucht den Text als Wert. ÄndereauftragsNameso, dass sie den Text zurückgibt, statt ihn auszugeben. Das Programm gibt dann aus:Auftrag: Wölfe im Wald (50 Gold) DIE VERLORENE KRONE [STUFE 3] - 2
Schreibe jetzt die Rückgabetypen beider Funktionen:
voidfürzeigeAuftragundstringfürauftragsName.