Typové argumenty
Když zavoláte prvni(jmena), neříkáte, co je T: TypeScript si to odvodí z argumentu. Je to zase odvozování typů, tentokrát pro typový parametr. Typ ale můžete napsat i sami, do špičatých závorek mezi název funkce a kulaté závorky:
const vudce = prvni<string>(jmena);Typ ve špičatých závorkách je typový argument. Dosadí se do typového parametru T, stejně jako se argument jmena dosadí do parametru prvky. Tady nic nezmění, protože TypeScript by string zvolil i sám. Teď ale kontroluje argumenty podle typu, který jste napsali:
function prvni<T>(prvky: T[]): T | undefined {
return prvky[0];
}
const lektvary = ["Léčivý lektvar", "Lektvar many"];
console.log(prvni<string>(lektvary));
console.log(prvni<number>(lektvary));TypeScript ohlásí:
main.ts(6,27): error TS2345: Argument of type 'string[]' is not assignable to parameter of type 'number[]'.
Type 'string' is not assignable to type 'number'.Když se za T dosadí number, z parametru prvky: T[] se stane number[] a pole textů do něj nepasuje. Odsazený druhý řádek vysvětluje proč: text není číslo. Delší hlášky mívají takových řádků víc. Čtěte je odshora, každý další jde víc do podrobností.
Typový parametr se může objevit na víc místech a všechna musí souhlasit:
function spoj<T>(prvni: T, druhy: T): T[] {
return [prvni, druhy];
}
console.log(spoj("Kira", "Bruno"));
console.log(spoj("Kira", 5));TypeScript ohlásí:
main.ts(6,26): error TS2345: Argument of type 'number' is not assignable to parameter of type 'string'.Z prvního argumentu, "Kira", TypeScript usoudil, že T je string, takže i druhý argument musí být text.
Funkce může mít i několik typových parametrů oddělených čárkami. Tahle vyrobí z libovolných dvou hodnot n-tici (lekce 2):
function dvojice<A, B>(prvni: A, druhy: B): [A, B] {
return [prvni, druhy];
}
const lektvarAPocet = dvojice("Léčivý lektvar", 3);
console.log(lektvarAPocet);Vypíše:
["Léčivý lektvar", 3]Tady je A typ string a B typ number, takže lektvarAPocet je typu [string, number].
Kdy typové argumenty psát. Většinou vůbec: nechte TypeScript, ať si je odvodí sám. Potřebujete je tehdy, když by odvodil příliš úzký typ. Tahle funkce naplní hodnotou tři přihrádky batohu. Kira začíná s prázdnými přihrádkami, tedy s null:
function naplnTri<T>(hodnota: T): T[] {
return [hodnota, hodnota, hodnota];
}
const prihradky = naplnTri(null);
prihradky[1] = "Štít";
console.log(prihradky);TypeScript ohlásí:
main.ts(6,1): error TS2322: Type '"Štít"' is not assignable to type 'null'.Z null TypeScript odvodil, že T je null, takže prihradky je pole, ve kterém smí být jen a jen null. Napište typ, který myslíte, jako typový argument, const prihradky = naplnTri<string | null>(null);, a do přihrádek se vejdou texty i null. Program pak vypíše:
[null, "Štít", null]Jak psát:
Pokyny
Napište generickou funkci opakuj<T>(hodnota: T, pocet: number): T[], která vrátí nové pole, v němž je hodnota tolikrát, kolik říká pocet. Začněte prázdným polem const vysledek: T[] = []; a hodnotu do něj přidávejte pomocí push v cyklu for.
Pod funkcí vytvořte const sipy = opakuj("Šíp", 3); a vypište sipy:
["Šíp", "Šíp", "Šíp"]Kira má v batohu čtyři přihrádky, zatím prázdné. Vytvořte je pomocí opakuj do proměnné prihradky: čtyřikrát null s typovým argumentem string | null, aby se do přihrádek později vešly i texty. Pak do první přihrádky (index 0) dejte "Meč" a vypište prihradky. Program vypíše:
["Šíp", "Šíp", "Šíp"]
["Meč", null, null, null]Začněte programovat zdarma
3/9