Başlangıçta JavaScript, sınıfların ve onların yapıcılarının katı bir tip belirlemesine sahip değildi, bu da çalışma zamanında hatalara yol açıyordu. TypeScript, daha güvenli bir programlama için tip sistemini ekledi ve kalıtım ile yapıcıların tip belirlemesini destekledi, bu da büyük uygulamaların geliştirilmesi için önemlidir.
TypeScript'te yapıcıların tip belirlemesi, yapıcı imzasının, oluşturulan örneğin türünün ve kalıtım özelliklerinin aynı anda dikkate alınmasını gerektirir. Temel ve türetilmiş sınıflardaki yapıcı imzaları uyuşmadığında veya yalnızca dönen değer tiplenip yapıcıya ait giriş parametreleri göz ardı edildiğinde problemler ortaya çıkar.
TypeScript'te yapıcıları, new (...args: any[]) => T ifadesini kullanarak özel imzalar aracılığıyla açıkça tipleyebilirsiniz. Kalıtım yapılırken imzaların tutarlılığına dikkat etmek ve temel sınıfları doğru bir şekilde genişletmek önemlidir.
Kod örneği:
class Animal { constructor(public name: string) {} } class Dog extends Animal { constructor(name: string, public breed: string) { super(name); } } // Yapıcı tipi function createInstance<T>(C: new (...args: any[]) => T, ...args: any[]): T { return new C(...args); } const dog = createInstance(Dog, 'Rex', 'Labrador');
Anahtar özellikler:
new ile tanımlanan ayrı bir varlıkJava veya C# gibi bir sınıfta birden fazla yapıcı tanımlanabilir mi?
Hayır, TypeScript çoklu yapıcıları desteklemez. Aşırı yükleme imzaları (overloads) kullanılarak aşırı yükleme taklit edilir. Doğru yaklaşım:
class Example { constructor(x: string); constructor(x: number); constructor(x: number | string) { // Tek bir uygulama } }
Yalnızca yapıcının dönen tipini tipleyerek parametreleri göz ardı edebilir miyiz?
Hayır, yapıcı imzası mutlaka parametreleri içermelidir. Doğru tipleme örneği:
interface Constructable<T> { new (...args: any[]): T; }
Eğer alt sınıfta yapıcı tanımlanırsa ve super çağrılmazsa ne olur?
Bir derleme hatası meydana gelir: alt sınıfın yapıcısı, this'e erişmeden önce super'ı çağırmalıdır.
Proje, (name) ile bir temel sınıf Animal kullandı ve (name, breed) ekledikleri Dog adlı miras alanda doğru bir şekilde imzayı genişletmeyi unuttular.
Artıları:
Eksileri:
Yapıcı tipi ayrı bir şekilde çıkarıldı, createInstance fabrikası CorrectConstructable<T> ile parametrelenmiş, imzalar korunmuştur.
Artıları:
Eksileri: