Funkce, které nic nevracejí

Některé funkce nic nevracejí. Jen něco udělají, třeba vypíšou řádek. Jejich návratový typ se jmenuje void, což anglicky znamená prázdnota:

function vypisHrdinu(jmeno: string, zivoty: number): void {
    console.log(`${jmeno}: ${zivoty} životů`);
}

vypisHrdinu("Kira", 50);
vypisHrdinu("Bruno", 65);

Vypíše:

Kira: 50 životů
Bruno: 65 životů

: void říká: tahle funkce nevrací žádnou hodnotu, voláte ji kvůli tomu, co udělá. Když ho vynecháte, TypeScript si void odvodí sám. Když ho ale napíšete, je jasné, co jste zamýšleli, a TypeScript ohlásí return s hodnotou, který se tam dostal omylem:

function vypisHrdinu(jmeno: string, zivoty: number): void {
    console.log(`${jmeno}: ${zivoty} životů`);
    return zivoty;
}
main.ts(3,5): error TS2322: Type 'number' is not assignable to type 'void'.

Funkce typu void smí použít return; bez hodnoty, když chce skončit dřív.

V JavaScriptu taková funkce vrací undefined a nic vám nebrání tento „výsledek“ omylem použít. Nejčastěji se to stane, když funkce vypisuje text, který ve skutečnosti potřebujete jako hodnotu. Rozdíl mezi vypsáním a vrácením hodnoty znáte z kurzu JavaScriptu:

function titulHrdiny(jmeno: string, uroven: number) {
    console.log(`${jmeno} z Havraní skály, úroveň ${uroven}`);
}

const titul = titulHrdiny("Kira", 3);
console.log(titul.toUpperCase());
main.ts(6,19): error TS2339: Property 'toUpperCase' does not exist on type 'void'.

V JavaScriptu by program titul vypsal a pak spadl s chybou TypeError: Cannot read properties of undefined (reading 'toUpperCase'). TypeScript ho zastaví ještě před spuštěním: titulHrdiny vrací void, takže v proměnné titul není nic, co by se dalo použít, a nemá žádné vlastnosti. Oprava: ať titulHrdiny text nevypisuje, ale vrací, s návratovým typem string. Kód, který ji volá, pak text může vypsat, převést na velká písmena nebo spojit s jiným.

Chybou je i jiné použití výsledku typu void, třeba v podmínce:

function vypisHrdinu(jmeno: string, zivoty: number): void {
    console.log(`${jmeno}: ${zivoty} životů`);
}

if (vypisHrdinu("Kira", 50)) {
    console.log("Vypsáno!");
}
main.ts(5,5): error TS1345: An expression of type 'void' cannot be tested for truthiness.

Bez chyby projde například console.log(vypisHrdinu("Kira", 50)), protože console.log přijme cokoli. Program vypíše řádek a pod něj undefined: znamení, že vypisujete výsledek funkce, která nic nevrací.

Typické chyby:

  • return s hodnotou ve funkci typu void: Type 'number' is not assignable to type 'void'. Buď má funkce hodnotu vracet (pak změňte návratový typ), nebo tam return nepatří.
  • Vypisování ve funkci, jejíž výsledek potřebujete. Když kód, který funkci volá, potřebuje hodnotu, musí ji funkce vrátit.

Pokyny

Funkce nazevUkolu svůj text vypisuje, ale program ho potřebuje jako hodnotu. Změňte nazevUkolu tak, aby text místo vypsání vrátila. Program pak vypíše:

Úkol: Vlci v lese (50 zlatých)
ZTRACENÁ KORUNA [ÚROVEŇ 3]

Teď napište návratové typy obou funkcí: void u vypisUkol a string u nazevUkolu.

Začněte programovat zdarma

Registrací souhlasíte s provozními podmínkami a zásadami ochrany osobních údajů.

Nebo se registrujte pomocí:

3/10