ProgramlamaFullstack Geliştirici

Tür genişletmesi (extends) nasıl çalışır, tipler ve arayüzler ile kullanımında hangi incelikler vardır ve bu projenizin yapısını nasıl etkiler?

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

Cevap

TypeScript'te tipleri genişletmek (kalıtım) interface extends ve type & type (kesişim tipleri) kullanarak yapılabilir. Ayrıca arayüzler tipleri genişletebilir ve tersine de geçerlidir.

Arayüzler mülkiyetleri miras almak için extends anahtar kelimesini kullanır:

interface Hayvan { isim: string; } interface Kuş extends Hayvan { kanatlar: number; }

Tipler & kullanılarak birleştirilebilir:

type Hayvan = { isim: string }; type Kuş = Hayvan & { kanatlar: number };

Ayrıca bir arayüz başka bir tipi genişletebilir:

type Temel = { id: number }; interface Türetilmiş extends Temel { açıklama: string; }

Özellikler:

  • Arayüzler deklaratif birleştirmeyi (declaration merging) destekler, tipler desteklemez.
  • Diğer varlıkların genişletileceği durumlarda arayüzler önerilir (örneğin, kütüphaneler için).
  • İç içe extends karmaşık bir hiyerarşiye yol açabilir, bakımı zorlaştırabilir ve isim çakışmalarına neden olabilir.

Kandırmaca sorusu

Bir tipi (type) bir arayüzle genişletmek ya da tersine? Çoğu kişinin yaptığı hata nedir?

Birçok kişi sadece arayüzlerin arayüzlerle genişletilebileceğini düşünür, ancak gerçekte bir arayüz bir tipi genişletebilir:

type Temel = { bayrak: boolean }; interface Ekstra extends Temel { isim: string; }

Ancak extends ile bir tipi diğer tiplerle genişletmek mümkün değildir — sadece tip kesişimi (&) ile mümkündür.

Konunun inceliklerini bilmemekten kaynaklanan gerçek hata örnekleri


Hikaye

Büyük bir projede arayüzleri extends ile birleştirirken, aynı adlı mülklerin tiplerinin uyuşması gerektiğini unuttular. Birisi üst arayüzde bir mülkün tipini değiştirdiğinde, alt arayüzlerde sessiz çatışmalar meydana geldi, veritabanı API'ye uymadı.

Hikaye

Bir kütüphanede & (kesişim) ile mülkleri örtüşen type-aliaslar yazdılar, ancak bazı mülkleri tip bakımından uyumsuz hale getirdiler. TypeScript bunu derleme aşamasında atladı, ancak aslında çalışma zamanında sistemde belirsiz alanlar ortaya çıktı.

Hikaye

Ekip, bir tipi arayüzle genişletmenin imkansız olduğunu düşündü ve ortak fonksiyonu genişletmek için tüm yapılarını type'den arayüze tekrar yazdılar, çok fazla zaman ve çaba harcadılar — aslında mevcut tipleri alışılmadık bir şekilde genişletebilirlerdi.