Funktionsüberladungen in TypeScript
Manchmal gibt es Funktionen, die Werte zurückgeben, deren Typ von den übergebenen Parametern abhängt. Dafür verwendet TypeScript Überladung von Funktionen. Sie erlaubt es, verschiedene Varianten von Funktionssignaturen anzugeben.
Schauen wir uns ein Beispiel an. Angenommen, wir haben eine Funktion, die die Zeichen eines Strings in ein Array von Buchstaben aufteilt:
function splitStr(str: string): string[] {
return str.split('');
}
Angenommen, wir haben auch eine Funktion, die die Ziffern einer Zahl in ein Array von Zahlen aufteilt:
function splitNum(num: number): number[] {
let str: string = String(num);
let arr: string[] = str.split('');
return arr.map(elem => +elem);
}
Lassen Sie uns beide Funktionen in einer zusammenführen. Die neue Funktion soll, abhängig vom Typ des Parameters, entweder ein Array von Zahlen oder ein Array von Strings zurückgeben.
Verwenden wir Überladung, um verschiedene Signaturen unserer Funktion zu deklarieren:
function splitVal(val: number): number[];
function splitVal(val: string): string[] {
// Implementierung beider Signaturen
}
Schreiben wir nun die Implementierung der Funktion. In ihrem Code müssen wir mit einer Bedingung bestimmen, welche der Funktionssignaturen ausgelöst wurde, und abhängig davon den entsprechenden Code mit einem Ergebnis des richtigen Typs ausführen:
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);
}
}
Im Gegensatz zu anderen Sprachen wird in TypeScript bei der Überladung eine einzelne Funktion erstellt. Es ist nicht möglich, mehrere Funktionen mit demselben Namen, aber unterschiedlichen Signaturen zu erstellen.
Schreiben Sie eine Funktion, die den Text eines DOM-Elements zurückgibt oder ändert. Sie sollte wie folgt funktionieren:
text('#elem', 'text'); // setzt den Text
text('#elem'); // gibt den aktuellen Text zurück