ProgramlamaFullstack geliştirici

TypeScript'te arayüzler (interface) ve tipler (type alias) hakkında bilgi verin. İkisi arasındaki farklar nelerdir ve hangisini seçmek için hangi durumlar uygundur?

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

Cevap.

Her iki mekanizma da interface ve type alias, veri yapılarının (nesneler, fonksiyonlar, karmaşık tipler) tanımlanmasına olanak tanır.

  • Interface — klasik arayüz tanımıdır. Arayüzleri genişletmeye, birleştirmeye (declaration merging) ve kolayca miras almaya olanak sağlar.
  • Type alias — yeni bir tip takma adı oluşturur. Birleşim / kesişim ile birleştirilebilir, her türlü varlığa atanabilir: ilkel türler, fonksiyonlar, tuple vb.

Farklar:

  • Genişletilebilirlik: interface, nesne yapıları için daha iyidir, deklaratif birleştirmeyi destekler.
  • Esneklik: type alias evrenseldir, her şeye uygundur: birleşim (|) ve kesişim (&).

Örnek:

interface Animal { name: string } interface Dog extends Animal { bark(): void } // tiplerin birleşimi için type alias: type MyType = string | number type Cat = Animal & { purr(): void }

Tavsiyeler:

  • Genel API'ler için — interface kullanılması önerilir.
  • Karmaşık birleşimler ve alias'lar için — type kullanılması önerilir.

Kandırmaca Sorusu.

Soru: Başka bir dosyada, type alias kullanılarak tanımlanan bir tipe yeni bir alan eklenebilir mi?

Cevap:

Hayır. Type alias, başka bir dosyadan deklaratif olarak genişletilemez, bu interface'ten farklıdır.

Örnek:

// main.ts type User = { name: string } // another.ts type User = { age: number } // Hata: Duplicate identifier // interface: // main.ts interface User { name: string } // another.ts interface User { age: number } // Tamam, User = { name: string, age: number }

Konuyla ilgili ince ayrıntılardan dolayı meydana gelen gerçek hata örnekleri.


Hikaye

Büyük bir projede, ortak veri yapıları type alias ile tanımlandı. Başka bir paketten mevcut bir tipe alan eklenmesi gerektiğinde, type alias'ın declaration merging'i desteklemediği anlaşıldı — bu nedenle interface'e geçmek zorunda kaldık, bu da gecikmelere neden oldu.


Hikaye

Bir geliştirici arayüz ile fonksiyonları tanımladı ve ardından bir birleşim tipi (string veya fonksiyon) eklemeye çalıştı — bu durumda interface'in uygun olmadığı ve tüm tanımlamaların type alias ile kesişim/birleşim olacak şekilde değiştirilmesi gerektiği ortaya çıktı.


Hikaye

Arayüzden type alias'a geçtikten sonra genişletme sözdizimini karıştırdılar: & ile birleştirmek yerine extends kullanmaya çalıştılar. Hata geç ortaya çıktı ve nedeni hemen anlaşılamadı.