Претоварване на функции в TypeScript
Понякога се срещат функции, които връщат стойности, чийто тип зависи от подадените параметри. За това в TypeScript използват претоварване на функции. То позволява да се укажат различни варианти на сигнатурите на функцията.
Нека разгледаме пример. Да предположим, че имаме функция, която разделя символите на низ в масив от букви:
function splitStr(str: string): string[] {
return str.split('');
}
Да предположим също, че имаме функция, която разделя цифрите на число в масив от цифри:
function splitNum(num: number): number[] {
let str: string = String(num);
let arr: string[] = str.split('');
return arr.map(elem => +elem);
}
Нека комбинираме двете функции в една. Новата функция в зависимост от типа на параметъра трябва да връща или масив от числа, или масив от низове.
Ще използваме претоварване, за да декларираме различни сигнатури на нашата функция:
function splitVal(val: number): number[];
function splitVal(val: string): string[] {
// имплементация на двете сигнатури
}
Нека сега напишем имплементацията на функцията. В нейния код трябва с условие да определим коя от сигнатурите на функцията е активирана, и в зависимост от това да изпълним нужния код с резултат от нужния тип:
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);
}
}
За разлика от други езици, в TypeScript при претоварването се създава една функция. Не може да се направят няколко функции с едно име, но с различни сигнатури.
Напишете функция, която ще връща или променя текста на DOM елемент. Тя трябва да работи по следния начин:
text('#elem', 'text'); // ще зададе текст
text('#elem'); // ще върне текущия текст