ProgramlamaFrontend/Fullstack geliştirici

TypeScript'te sınıf yapıcılarının tip belirlemesi nasıl çalışır ve kalıtım sırasında hangi zorluklar ortaya çıkabilir?

Hintsage yapay zeka asistanı ile mülakatları geçin

Cevap.

Sorunun Tarihçesi

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.

Problem

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.

Çözüm

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:

  • Yapıcı imzası — new ile tanımlanan ayrı bir varlık
  • Temel ve türetilmiş yapıcı parametrelerinin uyumunun korunması
  • Tiplenmiş yapıcılar aracılığıyla örneklerin evrensel olarak oluşturulması imkanı

Tuzak Sorular.

Java 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.

Tip Hataları ve Antipattern'ler

  • Temel ve türetilmiş sınıfın yapıcı parametrelerinin uyumsuz olması
  • Alt yapıcıda super çağrısının olmaması
  • Fabrikalar aracılığıyla soyutlanarak yapıcının yanlış tiplenmesi

Gerçek Hayattan Bir Örnek

Olumsuz Durum

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ı:

  • Yeni parametreleri belgeler

Eksileri:

  • Evrensel fabrikalar aracılığıyla örnekler yaratma sırasında uyumluluğun ihlali, derleme aşamasında hatalar

Olumlu Durum

Yapıcı tipi ayrı bir şekilde çıkarıldı, createInstance fabrikası CorrectConstructable<T> ile parametrelenmiş, imzalar korunmuştur.

Artıları:

  • Tip güvenliği, öngörülebilir davranış
  • Evrensel fonksiyonlar yazmak kolay

Eksileri:

  • Tip tanımlamasının daha titiz bir şekilde çalışmasını gerektirir