TypeScript’de yazdığımız metodları, alışmış olduğumuz şekilde ne yazık ki overload edemiyoruz. Ama tabi ki bu, TypeScript, “overloading”‘i desteklemiyor demek değil. Hatta TypeScript’in spesifikasyonunda overload desteğinin olduğunu görebilirsiniz.
Aşağıdaki gibi, C#’dan benzer bir yaklaşım ile yapabileceğimizi düşünsekte, aşağıdaki kodu derlemeye çalıştığımızda hata alıyor olacağız.
class MainClass { MethodA(): void { } MethodA(s: string): void { } MethodA(s: number, p: string) { } } window.onload = () => { var s: MainClass = new MainClass(); s.MethodA('TEST'); };
Alacağımız hata “Duplicate identifier ‘MethodA'” şeklinde bir şey olacaktır. Bunun sebebi Javascript tarafında, fonkisyonların tek bir tanımının olması gerekliliği. Peki nasıl yapacağız?
Overload yapacağımız metodların, deklarasyonlarını ayrıca belirtmemiz gerekiyor. Daha sonra bu deklerasyonlara uyumlu, tek bir metod ile metoda gelen parametrelerin tiplerini kontrol ederek overload özelliklerini tanımlayabiliriz.
class MainClass { MethodA(): void; //1.MethodA MethodA(s: string): void;//2.MethodA MethodA(s: number, p: string): void;//3.MethodA MethodA(s?:any,p2?:string): void { if (s && typeof s == "string") { alert('2.MethodA'); } else if ((s && typeof s == "number") && (p2 && typeof p2 == "string")) { alert('3.MethodA'); } else if(s===undefined && p2 ===undefined) { alert('1.MethodA'); } } } window.onload = () => { var s: MainClass = new MainClass(); s.MethodA(); s.MethodA('Hello'); s.MethodA(1,'Hello'); };
Burada önemli olan methodların içini tanımladığımız en son MethodA()’nın parametreleri ve içeriği. Dikkat ederseniz parametrelerin yanında “?” var. Bu o parametrenin olmayabileceğini de söylüyor. 2 parametre için de “?”ni koyuyor olmamız, boş parametre ile çağırabileceğimiz ilk MethodA deklarasyonunu sağlıyor. İlk parametrenin “any” keyword’ü ile olması da, o parametrenin herhangi bir tipde olabileceğini belirtiyor.
Bu sayede TypeScript’de metodlarımızı overload edebiliyor. Çok alışa gelmiş bir yöntem değil ama mevcut Javascript alt yapısından dolayı bu şekilde yapabiliyoruz ne yazık ki.
Kodumuzun derlendiğinde ortaya çıkan Javascript’de aşağıdaki gibi olacaktır.
var MainClass = (function () { function MainClass() { } MainClass.prototype.MethodA = function (s, p2) { if (s && typeof s == "string") { alert('2.MethodA'); } else if ((s && typeof s == "number") && (p2 && typeof p2 == "string")) { alert('3.MethodA'); } else if (s === undefined && p2 === undefined) { alert('1.MethodA'); } }; return MainClass; })(); window.onload = function () { var s = new MainClass(); s.MethodA(); s.MethodA('Hello'); s.MethodA(1, 'Hello'); };