Menu

TypeScript extends: Interface veya Type Genişletme

extends anahtar kelimesi bir tipi başka bir tipten oluşturur. Bir interface'i (bir kez ya da birkaç tanesinden) genişletmeyi, bir type alias'ı & ile genişletmeyi, bir özellik tipini geçersiz kılmayı, özellikleri Omit ile değiştirmeyi ve extends'in sınıflarda, generic kısıtlarında ve conditional tiplerde ne anlama geldiğini öğrenin.

Bu sayfada çalıştırılabilir editörler var - düzenle, çalıştır ve sonucu anında gör.

interface Child extends Parent, Parent tipinin her üyesine ve kendi üyelerine sahip yeni bir interface oluşturur. Çocuk tipin değerleri, ebeveynin beklendiği her yerde kullanılabilir, çünkü onun tüm özelliklerine sahiptirler.

Aynı anahtar kelime TypeScript'te birbiriyle ilişkili ama farklı anlamlarla dört yerde karşınıza çıkar:

NeredeÖrnekAnlamı
Interfaceinterface Dog extends Animal {}ebeveynin üyelerini miras al
Sınıfclass Dog extends Animal {}alanları ve metot gerçeklemelerini miras al (çalışma zamanı JavaScript'i)
Generic parametre<T extends Animal>kısıt: tip argümanı Animal tipine atanabilir olmalı
Conditional tipT extends string ? A : Btest: T, string tipine atanabilir mi?

Birden Fazla Interface'i Genişletmek

extends sonrasında birkaç ebeveyni virgülle ayırarak listeleyin. Sonuç hepsinin üyelerine sahip olur:

interface Identified {
  id: number;
}

interface Timestamped {
  createdAt: Date;
  updatedAt: Date;
}

interface Post extends Identified, Timestamped {
  title: string;
}

// Post requires id, createdAt, updatedAt and title

İki ebeveyn aynı özelliği özdeş olmayan tiplerle bildiriyorsa çocuk TS2320 hatasıdır (Interface 'Post' cannot simultaneously extend types 'A' and 'B'); tabii çocuk o özelliği ikisine de atanabilen bir tiple yeniden bildirmediği sürece.

Bir Type Alias'ı Genişletmek

Bir type alias'ının extends ifadesi yoktur. Onun üzerine, iki tarafın üyelerini birleştiren bir intersection, &, ile kurarsınız. Bir interface bir nesne type alias'ını doğrudan da genişletebilir, bir type alias da bir interface ile intersection oluşturabilir: iki tür serbestçe karışır.

İki yol, özellikler çakışana kadar aynı şekilde davranır: extends çakışan bir özelliği bildirimde bildirir, & ise onu sessizce never yapar. Karşılaştırma interface ile type sayfasında, & ayrıntıları da intersection tipler sayfasında.

Özellik Tiplerini Geçersiz Kılmak

Bir çocuk interface bir ebeveyn özelliğini yeniden bildirebilir, ama yalnızca ebeveyninkine atanabilen bir tiple. string tipini bir literal'e daraltmak ya da bir union'dan null çıkarmak serbesttir. Tipi ilgisiz bir şeye değiştirmek serbest değildir:

index.ts(13,11): error TS2430: Interface 'Label' incorrectly extends interface 'Shape'.
  Types of property 'kind' are incompatible.
    Type 'number' is not assignable to type 'string'.

Kural, bir Label değerinin hâlâ Shape beklenen her yerde kullanılabilmesi için vardır. kind bir sayı olabilseydi, Shape için yazılmış ve shape.kind.toUpperCase() çağıran kod bozulurdu.

Özellikleri Omit ile Değiştirmek

Miras alınan bir özellik için gerçekten farklı bir tipe ihtiyacınız olduğunda, önce onu Omit ile ebeveynden çıkarın, sonra yenisini bildirin. Yaygın bir durum, kimliklerin ve tarihlerin string olarak geldiği API verilerini dönüştürmektir:

Omit<ApiUser, "id" | "createdAt"> tipi { name: string } olur, bu yüzden yeni id ve createdAt hiçbir şeyle çakışmaz. Pick, Partial ve diğer utility tipler de aynı şekilde genişletilebilir.

Sınıflarla extends

class Dog extends Animal JavaScript sınıf kalıtımıdır ve interface extends ifadesinin aksine çalışma zamanında vardır: Dog, Animal sınıfının constructor'ını, alanlarını ve metot gerçeklemelerini alır ve new Dog(...) instanceof Animal sonucu true olur. TypeScript bunun üzerine override anahtar kelimesi gibi tip kontrolleri ekler:

Bir sınıf yalnızca bir sınıfı extends edebilir, ama istediği sayıda interface'i implements edebilir. implements hiçbir şey kopyalamaz: yalnızca sınıfın interface'in gerektirdiklerini bildirdiğini kontrol eder. super, protected üyeler ve override kalıtım sayfasında anlatılıyor.

Generic'lerde ve Conditional Tiplerde extends

Açılı parantezlerin içinde extends bir kısıttır. <T extends { length: number }>, sayısal bir length özelliğine sahip her tip argümanını kabul eder ve fonksiyon gövdesinin .length kullanmasına izin verir. Bir conditional tipte T extends U ? X : Y, T tipinin U tipine atanabilir olup olmadığını sorar.

İki yerde de extends, interface biçiminin kontrol ettiği aynı ilişki olan "atanabilir" anlamına gelir. Kısıtlar generic kısıtları sayfasında, tip düzeyindeki testler de conditional tipler sayfasında ayrıntılı anlatılıyor.

Sıkça Sorulan Sorular

TypeScript'te bir interface nasıl genişletilir?

interface Child extends Parent { ... } yazın. Çocuk, ebeveynin her özelliğine ve kendi bildirdiklerine sahip olur. Birkaç interface'i birden genişletmek için onları virgülle ayırın: interface C extends A, B { ... }.

TypeScript'te bir type alias nasıl genişletilir?

Bir type alias extends kullanamaz; bunun yerine tipleri bir intersection ile birleştirin: type Admin = User & { permissions: string[] }. Bir interface de bir nesne type alias'ını doğrudan genişletebilir: interface Admin extends User { permissions: string[] }.

Bir interface'i genişletirken bir özellik tipini geçersiz kılabilir miyim?

Yalnızca uyumlu, daha dar bir tiple: kind: "circle", kind: string yerine geçebilir. Bir string özelliği için number gibi farklı bir tip TS2430 hatasıdır (Interface 'X' incorrectly extends interface 'Y'). Bir özelliği ilgisiz bir tiple değiştirmek için önce onu çıkarın: interface User extends Omit<ApiUser, "id"> { id: number }.

extends ile implements arasındaki fark nedir?

extends miras alır: bir interface ebeveynin üyelerini, bir sınıf da ebeveyn sınıfın alanlarını ve metot gerçeklemelerini alır. implements ise yalnızca kontrol eder: bir interface'i implement eden bir sınıf her üyeyi kendisi bildirmek zorundadır ve interface'ten hiçbir şey kazanmaz.

<T extends string> gibi bir generic'te extends ne anlama gelir?

Bir kısıttır, miras değil. T extends string, tip argümanının string tipine atanabilir olması gerektiği anlamına gelir; böylece fonksiyonun içinde T üzerinde string metotlarını kullanabilirsiniz. Bir conditional tipte T extends U ? X : Y bir testtir: T, U tipine atanabiliyorsa sonuç X, aksi halde Y olur.

Coddy programming languages illustration

Coddy ile kodlamayı öğren

BAŞLA