Co to jest przeciążenie funkcji w ogóle?
Przeciążenie funkcji lub przeciążenie metody to możliwość tworzenia wielu funkcji o tej samej nazwie z różnymi implementacjami ( Wikipedia )
Co to jest przeciążenie funkcji w JS?
Ta funkcja nie jest możliwa w JS - ostatnia zdefiniowana funkcja jest przyjmowana w przypadku wielu deklaracji:
function foo(a1, a2) { return `${a1}, ${a2}` }
function foo(a1) { return `${a1}` } // replaces above `foo` declaration
foo(42, "foo") // "42"
... i w TS?
Przeciążenia to konstrukcja czasu kompilacji, która nie ma wpływu na środowisko wykonawcze JS:
function foo(s: string): string // overload #1 of foo
function foo(s: string, n: number): number // overload #2 of foo
function foo(s: string, n?: number): string | number {/* ... */} // foo implementation
W przypadku użycia powyższego kodu (bezpieczniejszego niż JS) wyzwalany jest duplikat błędu implementacji. TS wybiera pierwsze dopasowanie przeciążenia w kolejności od góry, więc przeciążenia są sortowane od najbardziej specyficznych do najbardziej rozległych.
Przeciążenie metody w TS: bardziej złożony przykład
Typy metod klas przeciążonych mogą być używane w podobny sposób jak przeciążanie funkcji:
class LayerFactory {
createFeatureLayer(a1: string, a2: number): string
createFeatureLayer(a1: number, a2: boolean, a3: string): number
createFeatureLayer(a1: string | number, a2: number | boolean, a3?: string)
: number | string { /*... your implementation*/ }
}
const fact = new LayerFactory()
fact.createFeatureLayer("foo", 42) // string
fact.createFeatureLayer(3, true, "bar") // number
Możliwe są bardzo różne przeciążenia, ponieważ implementacja funkcji jest kompatybilna ze wszystkimi sygnaturami przeciążenia - wymuszonymi przez kompilator.
Więcej informacji: