Nepovinné parametry

Někdy se argument opravdu smí vynechat. Hostinský ohlašuje každého hosta, ale jen někteří hosté mají titul, třeba sir nebo lady. Volání bez titulu by TypeScript ohlásil jako chybu (Expected 2 arguments, but got 1.), a tak musíte říct, že parametr je nepovinný: za jeho název napište otazník:

function ohlas(jmeno: string, titul?: string): string {
    if (titul === undefined) {
        return `Do hostince přichází ${jmeno}.`;
    }
    return `Do hostince přichází ${titul} ${jmeno}.`;
}

console.log(ohlas("Kira"));
console.log(ohlas("Bruno", "sir"));

Vypíše:

Do hostince přichází Kira.
Do hostince přichází sir Bruno.

Funkce ohlas teď bere jeden nebo dva argumenty. Se třemi by TypeScript ohlásil Expected 1-2 arguments, but got 3.

Když argument vynecháte, má parametr hodnotu undefined, stejně jako v JavaScriptu. Uvnitř funkce proto titul není prostě string. Jeho typ je string | undefined, tedy „text, nebo undefined“. (Svislá čára znamená „nebo“. Takovým typům se věnuje lekce 5.) Dokud neověříte, že titul není undefined, nedovolí vám ho TypeScript použít jako text:

function ohlas(jmeno: string, titul?: string): string {
    return `Do hostince přichází ${titul.toUpperCase()} ${jmeno}.`;
}

console.log(ohlas("Kira"));
main.ts(2,36): error TS18048: 'titul' is possibly 'undefined'.

'titul' is possibly 'undefined' (titul může být undefined): v JavaScriptu by tu volání ohlas("Kira") skončilo chybou TypeError: Cannot read properties of undefined (reading 'toUpperCase'). TypeScript to ohlásí ještě před spuštěním.

V prvním příkladu if vyřídí hosta bez titulu a vrátí výsledek. TypeScript sleduje podmínky ve vašem kódu, a tak ví, že pod tímto if může být titul už jen string a smíte s ním tak zacházet.

Pozor ale na šablonové řetězce. Do nich TypeScript undefined pustí a stane se z něj text undefined. Bez kontroly by volání ohlas("Kira") vrátilo Do hostince přichází undefined Kira., a to bez chyby. Tady je kontrola na vás.

Nepovinné parametry patří za povinné. Argumenty se do parametrů dosazují podle pořadí, takže jinak by se při volání ohlas("Kira") dostalo "Kira" do titulu:

function ohlas(titul?: string, jmeno: string): string {
    return `Do hostince přichází ${jmeno}.`;
}
main.ts(1,32): error TS1016: A required parameter cannot follow an optional parameter.

Typické chyby:

  • Použití parametru bez kontroly: 'titul' is possibly 'undefined'.
  • Otazník za typem, titul: string?, místo za názvem. TypeScript ohlásí '?' at the end of a type is not valid TypeScript syntax. Did you mean to write 'string | undefined'? (otazník na konci typu není platný zápis, nechtěli jste napsat string | undefined?). Otazník patří hned za název parametru: titul?: string.

Pokyny

Druhý úkol nemá žádný bonus. Udělejte z parametru bonus nepovinný parametr. TypeScript pak ohlásí 'bonus' is possibly 'undefined'. Opravte to: když je bonus undefined, vrátí funkce jen odmena. Program vypíše 70 a 30.

Napište funkci textOdmeny s parametrem nazev typu string, nepovinným parametrem zlato typu number a návratovým typem string. Se zlatem vrátí text jako Vlci v lese: 70 zlatých, bez něj Ztracená koruna: bez odměny. Vypište textOdmeny("Vlci v lese", celkovaOdmena(50, 20)) a textOdmeny("Ztracená koruna"). Program vypíše:

70
30
Vlci v lese: 70 zlatých
Ztracená koruna: bez odměny

Začněte programovat zdarma

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

Nebo se registrujte pomocí:

5/10