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:
extends karmaşık bir hiyerarşiye yol açabilir, bakımı zorlaştırabilir ve isim çakışmalarına neden olabilir.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.
Hikaye
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
& (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.