Přetížení funkcí v TypeScript
Někdy se setkáme s funkcemi, které vracejí hodnoty, jejichž typ závisí na předaných parametrech. K tomu v TypeScriptu používají přetížení funkcí. To umožňuje specifikovat různé varianty signatur funkce.
Podívejme se na příklad. Předpokládejme, že máme funkci, která rozděluje znaky řetězce do pole písmen:
function splitStr(str: string): string[] {
return str.split('');
}
Předpokládejme také, že máme funkci, která rozděluje číslice čísla do pole čísel:
function splitNum(num: number): number[] {
let str: string = String(num);
let arr: string[] = str.split('');
return arr.map(elem => +elem);
}
Spojme obě funkce do jedné. Nová funkce by v závislosti na typu parametru měla vrátit buď pole čísel, nebo pole řetězců.
Použijme přetížení k deklarování různých signatur naší funkce:
function splitVal(val: number): number[];
function splitVal(val: string): string[] {
// implementace obou signatur
}
Nyní napišme implementaci funkce. V jejím kódu musíme podmínkou určit, která signatura funkce se aktivovala, a v závislosti na tom spustit příslušný kód s výsledkem požadovaného typu:
function splitVal(val: number): number[];
function splitVal(val: string): string[] {
if (typeof val === 'string') {
return val.split('');
} else {
let str: string = String(val);
let arr: string[] = str.split('');
return arr.map((elem: string): number => +elem);
}
}
Na rozdíl od jiných jazyků, v TypeScriptu se při přetížení vytváří jedna funkce. Nelze vytvořit více funkcí se stejným názvem, ale s různými signaturami.
Napište funkci, která bude vracet nebo měnit text DOM elementu. Měla by fungovat následovně:
text('#elem', 'text'); // nastaví text
text('#elem'); // vrátí aktuální text