TypeScript’de Aşırı Fonksiyon Yüklemesi (Function Overloading)

Tek uygulama içerisinde aynı isimde birden fazla fonksiyon tanımlanabilir. Sadece aynı sayıda ve farklı tip parametre içermelidir. 

Örnek kullanım;

function add(a:string, b:string):string;
function add(a:number, b:number): number;

function add(a: any, b:any): any {
return a + b;
}

add("Hello ", "Steve"); // geri dönen değer: "Hello Steve" 
add(10, 20); // geri dönen değer: 30

Özelleştirilmiş Aşırı Yüklenen İmzalar (Specialized Overload Signatures)

Farklı tipte parametre vermek yerine string sabitleri ile overload oluşturmak için kullanılır.

Bu yöntem için kurallar;

  1. En az bir tane nonspecialized signature olmalıdır.
  2. Özel imza nonspecializd imzanın subtype’ını döndürmelidir.
  3. Implementation imza tm imzalar ile uyumlu olmalıdır.
class RandomHandler { };
class ReversedHandler { };
class Handler { };
class HandlerFactory {
getHandler(type: 'Random'): RandomHandler;
getHandler(type: 'Reversed'): ReversedHandler;
getHandler(type: string): Handler; // non-specialized signature-bu satır olmadan
kod çalışmaz
getHandler(type: string): Handler { // implementation signature
switch (type) {
case 'Random':
return new RandomHandler();
case 'Reversed':
return new ReversedHandler();
default:
return new Handler();
}
}
}

Özelleştirilmiş imzaların en çok kullanıldığı alan özelleştirilmemiş imzanın superclass’ları döndürdüğü durumlarda kullanılmaktadır. Temel bir bileşen olan DOM’daki (Document Object Model) getElementsByTagName’in nasıl tanımlandığı aşağıda gösterilmiştir.

// This example does not list all variations...
getElementsByTagName(name: "a"): NodeListOf<HTMLAnchorElement>;
getElementsByTagName(name: "blockquote"): NodeListOf<HTMLQuoteElement>;
getElementsByTagName(name: "body"): NodeListOf<HTMLBodyElement>;
getElementsByTagName(name: "button"): NodeListOf<HTMLButtonElement>;
getElementsByTagName(name: "form"): NodeListOf<HTMLFormElement>;
getElementsByTagName(name: "h1"): NodeListOf<HTMLHeadingElement>;
getElementsByTagName(name: string): NodeList; // Non-specialized signature
getElementsByTagName(name: string): NodeList { // implementation signature
return document.getElementsByTagName(name);
}