Karmaşık veri yapılarını TypeScript'te tanımlamak için arayüzler (interface) ve tür takma adları (type) kullanılır. Bunlar, nesneler, diziler ve iç içe tiplerle birleştirilerek karmaşık koleksiyonların katı tiplenmesi sağlanır.
İç içe nesne için:
interface Address { city: string; zip: number; } interface UserProfile { name: string; age: number; address: Address; }
Farklı türlerle diziler için:
// Tuple let tuple: [string, number] = ['John', 30]; // Union tiplerle diziler let arr: (string | number)[] = [1, 'a', 2, 'b']; // Nesne dizileri let users: UserProfile[] = [ {...}, {...} ];
Yapılar karmaşık olduğunda ve opsiyonel alanlar olduğunda, ? kullanılır, Partial, Record, Mapped Types veya iç içe ağaçlar için rekürsif türlerle birleştirilir.
Soru: Farklı türdeki elemanları olan bir diziyi (örneğin, [string, number, boolean]) tanımlamak için arayüz kullanabilir miyiz?
Cevap: Hayır. Bu durum için en iyi yöntem tuple kullanmaktır — arayüzler belirli konumlar ve türler için uygun değildir. Tuple, her konum için katı türler belirlemeyi sağlar.
type MyTuple = [string, number, boolean]; let foo: MyTuple = ['ok', 12, false];
Hikaye
Bir projede karmaşık bir yapı yanlış tanımlandı: farklı türlerle diziler için any[] kullanıldı, oysa doğru olan bir tuple ya da union-tipi olmalıydı. Sonuçta, elemanlardan birinde beklenmeyen bir tür değeri bulundu ve bu, iş mantığında hata ile sonuçlandı (bir string ile aritmetik işlem).
Hikaye
Veri yapısında derinlemesine iç içe nesneler, rekürsif türler veya Partial kullanılmadan tanımlandı. Bir ağaç düğümüne yeni bir alt ağaç eklemeye çalışmak derleyici hatasına neden oldu ve geliştiriciler bunu any ile downcast ederek geçiştirdiler, bu da prodüksiyonda çalışma zamanı hatalarına yol açtı.
Hikaye
Kullanıcı profilini tanımlayan bir nesne kısmen opsiyoneldi, ancak geliştirici ? kullanmadı. Sunucudan veri alındığında TypeScript hata vermedi, ancak uygulama olmayan alanlara erişmeye çalışırken çöktü.