In TypeScript wird die Funktionsüberladung erreicht, indem mehrere Funktionssignaturen mit unterschiedlichen Typen und/oder Anzahlen von Argumenten deklariert werden, jedoch mit einer einzigen Implementierung.
Das Hauptmerkmal: Die Implementierung ist immer eine, und der Compiler überprüft die Übereinstimmung des Aufrufs mit einer der deklarierten Signaturen.
function greet(person: string): string; function greet(person: string, age: number): string; function greet(person: string, age?: number): string { if (age !== undefined) { return `Hallo, ${person}. Du bist ${age}!`; } else { return `Hallo, ${person}!`; } } greet('Alice'); // 'Hallo, Alice!' greet('Bob', 32); // 'Hallo, Bob. Du bist 32!'
⚠️ Im Gegensatz zu C# oder Java gibt es keine mehreren Implementierungen der Funktion — alle Signaturen werden in eine Funktion aufgelöst, die eine notwendige Überprüfung innerhalb hat.
Muss jede überladene Signatur in TypeScript als separate Funktion implementiert werden, wie zum Beispiel in C#?
Antwort: Nein! In TypeScript gibt es für die überladene Funktion nur eine Implementierung. Alle Variationen werden über eine Menge von Signaturdeklarationen festgelegt. Die Implementierung muss selbstständig verschiedene Variationen der Eingabewerte innerhalb einer Funktion verarbeiten.
Geschichte
In einem Projekt hat der Entwickler zwei Funktionen mit demselben Namen deklariert, in der Hoffnung auf Überladung wie in Java. Letztendlich funktionierte nur die letzte definierte Funktion, während die anderen "überschrieben" wurden. Dies führte zu unerwarteten Fehlern im Betrieb und enormen zeitlichen Aufwänden für die Refaktorisierung.
Geschichte
Es wurde keine korrekte Typprüfung innerhalb der Implementierung der überladenen Funktion durchgeführt. Die Funktion gab sporadisch Werte falscher Typen zurück, was den Kunden Schwierigkeiten bereitete, da TypeScript die Implementierung der Überladungen nicht validiert.
Geschichte
Die Überladung wurde nur auf der Typenebene implementiert (Signaturen deklariert), aber es wurde keine Kompatibilität mit der Runtime-Implementierung sichergestellt (fehlende optionale Parameter und Verarbeitung innerhalb der Funktion). Dies führte zu Abstürzen bei Aufrufen mit "typenmäßig gültigen" Parametern, weil die Runtime diese Varianten nicht unterstützte.