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:
returns hodnotou ve funkci typuvoid:Type 'number' is not assignable to type 'void'.Buď má funkce hodnotu vracet (pak změňte návratový typ), nebo tamreturnnepatří.- Vypisování ve funkci, jejíž výsledek potřebujete. Když kód, který funkci volá, potřebuje hodnotu, musí ji funkce vrátit.
Jak psát:
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
3/10