ProgramlamaFrontend geliştirici

TypeScript'te sınıf tipleri ve mirası nasıl çalışır? Özelliklerin ve yöntemlerin beyanındaki özellikler nelerdir, bu süreçte hangi sorunlar ortaya çıkabilir ve bunlar nasıl çözülür?

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

Cevap.

Sorunun Geçmişi

Sınıf tipleri ve miras, TypeScript'te, diğer dillerde (Java, C#) alışkın olunan nesne yönelimli şablonları desteklemek için eklenmiştir. TypeScript, özelliklerin ve yöntemlerin türlerini açık bir şekilde belirtmeye ve tür güvenliği ile miras almaya olanak tanır.

Sorun

JavaScript'te açık bir tür belirtimi olmadan, özelliklerin yanlış kullanımıyla ilgili hatalar derleme aşamasında tespit edilmez. Sorunlar, alt sınıflarda yöntemlerin/özelliklerin yeniden tanımlanması, temel sınıfın sözleşmesine aykırı hareket edilmesi ve protected/private ile yanlış çalışma gibi durumlarda ortaya çıkar.

Çözüm

TypeScript, açıkça özelliklerin ve yöntemlerin türlerini belirtmeyi, public, private, protected anahtar kelimelerini kullanmayı, extends ile sınıfları miras almayı ve arayüzleri gerçekleştirmeyi mümkün kılar.

Kod örneği:

class Animal { public name: string; protected age: number; private secret: string = "hidden"; constructor(name: string, age: number) { this.name = name; this.age = age; } speak(): void { console.log(`${this.name} makes a sound.`); } } class Dog extends Animal { constructor(name: string, age: number) { super(name, age); } speak(): void { console.log(`${this.name} barks.`); } } const dog = new Dog("Rex", 4); dog.speak(); // Rex barks.

Anahtar özellikler:

  • Sınıf özelliklerinin ve yöntemlerinin türlerinin açık bir şekilde belirtilmesi
  • Kapsülleme için erişim değiştiricilerinin kullanılması
  • Tür denetimi ile miras alma ve yöntemlerin yeniden tanımlanması desteği

İkili Sorular.

Eğer sınıf alanının türünü belirtmezsem ne olur?

TypeScript, atanacak değere göre türü çıkarmaya çalışır, eğer atanacak bir değer varsa. Eğer yoksa - tür any olacak, bu da kodun güvenliğini düşürür.

class Test { value; constructor(v: number) { this.value = v; } }

value, varsayılan bir değer belirtilmediyse any türünden olacaktır, bu da tür güvenliğinde potansiyel bir açık oluşturur.

Miras alınan bir yönteminin erişim belirleyicisini değiştirebilir miyim?

Evet, ama yalnızca güçlendirerek (örneğin, public'den protected'a ya da private'a - bu mümkün değil), ancak private'dan public'e geçirilemez, çünkü private üyesi miras alınmaz. Bu bir derleme hatasına yol açar.

TypeScript'te birden fazla sınıftan miras alabilir miyim?

Hayır, sınıflar için çoklu miras yasaktır. Birden fazla arayüzü uygulamak mümkündür, ancak sadece bir sınıfı extends edebilirsiniz.

Tipik Hatalar ve Anti-Desenler

  • Özellik türlerinin belirtilmemesi implicit any'e yol açar
  • Yöntemlerin yanlış yeniden tanımlanması (uyumsuz imza ile)
  • Kapsülleme ihlali (özel özelliklerin açılması)

Hayattan Bir Örnek

Negatif Durum

Projede tüm sınıflar, erişim belirleyicileri ve açık türler olmadan, geliştirmeyi hızlandırmak için tanımlanıyordu.

Artıları:

  • Hızlı başlangıç prototiplemesi

Eksileri:

  • Erişim hatalarını izlemek zor
  • Sakıncalı özelliklerin yanlışlıkla yeniden tanımlanmasından kaynaklanan sık hatalar

Pozitif Durum

Sınıfın tüm üyeleri titizlikle tiplenmiştir, private/protected/public kullanılmakta, özelliklerin ve yöntemlerin katı bir tür kontrolü uygulanmaktadır.

Artıları:

  • Derleme aşamasında hataların önlenmesi
  • Açık bir mimari, nesne yapısını anlamayı kolaylaştırır

Eksileri:

  • Tasarımda daha fazla zaman gerektirir, deneysel görevlerde daha az esneklik