W TypeScript przeciążanie funkcji osiąga się poprzez deklaracje kilku sygnatur funkcji z różnymi typami i/lub ilością argumentów, ale z jedną realizacją.
Główna cecha: implementacja zawsze jest jedna, a kompilator sprawdza zgodność wywołania z jedną z zadeklarowanych sygnatur.
function greet(person: string): string; function greet(person: string, age: number): string; function greet(person: string, age?: number): string { if (age !== undefined) { return `Hello, ${person}. You are ${age}!`; } else { return `Hello, ${person}!`; } } greet('Alice'); // 'Hello, Alice!' greet('Bob', 32); // 'Hello, Bob. You are 32!'
⚠️ W przeciwieństwie do C# lub Java, nie ma wielu implementacji funkcji — wszystkie sygnatury są rozwiązywane w jedną funkcję z obowiązkową kontrolą wewnątrz.
Czy należy implementować każdą przeciążoną sygnaturę w TypeScript jako osobną funkcję, tak jak w C#?
Odpowiedź: Nie! W TypeScript dla przeciążonej funkcji istnieje tylko jedna implementacja. Wszystkie warianty są określane przez zestaw deklaracji sygnatur. To implementacja powinna samodzielnie obsługiwać różne warianty parametrów wejściowych wewnątrz jednej funkcji.
Historia
Na projekcie programista zadeklarował dwie funkcje o tej samej nazwie, licząc na przeciążenie, jak w Javie. W rezultacie działała tylko ostatnia zdefiniowana funkcja, a pozostałe zostały "nadpisane". Doprowadziło to do nieoczekiwanych błędów w działaniu oraz ogromnych nakładów czasu na refaktoryzację.
Historia
Nie zrealizowano poprawnej weryfikacji typów wewnątrz realizacji przeciążonej funkcji. Funkcja okresowo zwracała wartości nie tego typu, który oczekiwali klienci, co spowodowało trudności w uchwyceniu błędu, ponieważ TypeScript nie waliduje realizacji przeciążeń.
Historia
Użyto implementacji przeciążenia tylko na poziomie typów (zadeklarowano sygnatury), ale nie zapewniono kompatybilności z realizacją w czasie wykonania (brak opcjonalnych parametrów i przetwarzania wewnątrz funkcji). Doprowadziło to do awarii przy wywołaniu z "ważnymi typowo" parametrami, ponieważ czas wykonania tych wariantów nie wspierał.