ProgramlamaFrontend geliştirici

TypeScript'te genişletilebilir türlerin (index signatures) mekanizması nasıl çalışır? Ne amaçla kullanılır, incelikleri nelerdir ve bu tür yapıların tasarımında hangi riskler vardır?

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

Cevap.

Sorunun Tarihi

TypeScript, önceden belirlenemeyen tüm anahtarlar için dinamik özellik isimlerine sahip nesneleri tanımlamayı sağlar. Bunun için, harita, dış sunucudan gelen veriler vb. gibi varyatif nesnelerin tiplerini tanımlamak için kullanılan index signatures uygulanır.

Problem

Index signature olmadan, nesne yalnızca önceden belirlenmiş anahtarlar üzerinden değerlendirilir, diğer tüm anahtarlar derleme hatası alır. Ayrıca, yanlış bir signature bildirimi, nesnenin tüm özelliklerinin türlerini bulanıklaştırabilir, tür katılığını azaltabilir ve hatalara yol açabilir.

Çözüm

Index signature'ı, yalnızca gerektiği durumlarda açıkça tanımlayın. String anahtarı ile nesne dizisi tipi için aşağıdaki biçimi kullanın:

Kod örneği:

interface Dictionary { [key: string]: number; length?: number; } const sample: Dictionary = { apples: 4, oranges: 10 }; sample['bananas'] = 6;

Anahtar özellikler:

  • Rastgele anahtarlara sahip koleksiyonları tanımlamaya olanak tanır
  • Tüm elemanların değerlerinin tek tip olmasına dayanır
  • Signature nedeniyle tüm ek özellikler bu tipe uymalıdır

Kandırmaca Sorular.

Index signature içerisinde farklı anahtarlar için farklı değer türleri tanımlanabilir mi?

Hayır, tip tüm anahtar setinde geçerlidir. Eğer [key: string]: number olarak belirtirseniz, sample.length de bir number olmalıdır: bu, index signature ve bilinen özelliklerin bir arada kullanılması durumunda sık sık hata almanıza yol açar.

Symbol’lerle index signature kullanılabilir mi?

Evet, ES6'dan itibaren TypeScript, sembol için index signature'ı destekler:

interface SymbolMap { [key: symbol]: string; }

Index signature ve farklı türlerde ek özellikler içeren bir nesne ilan ederseniz ne olur?

Derleyici, özellik tipi, index signature'ı tarafından belirtilen değer tipi ile uyumlu değilse bir hata verecektir. Bunu union tipi kullanarak aşabilir veya böyle alanları ayrı bir arayüze çıkarabilirsiniz.

Tipik Hatalar ve Antipatronlar

  • Katı arayüzler yerine aşırı index signature kullanımı
  • Nesne tipinin bulanıklaşması
  • Bilinen ve indeks özelliklerin yanlış birleştirilmesi

Gerçek Hayattan Örnek

Olumsuz Durum

Sunucudan gelen her yanıt için {[key: string]: any} arayüzü kullanıldı, bu da veri yapısının kontrolünün kaybolması nedeniyle sızan hatalara neden oldu.

Artıları:

  • Evrensellik

Eksileri:

  • Nesne içinde katı tip kontrolünün tamamen kaybolması
  • Gizli hatalar, üretimde "sürprizler"

Olumlu Durum

Index signature'ın yalnızca dictionaries için (örneğin, anahtar bazında yapılandırma) ve bilinen özelliklerin yalnızca signature dışında tip bildirimleri ile açık bir şekilde kullanılması.

Artıları:

  • Koleksiyonlar/haritalar için net bir yapı
  • Bilinen alanlar için katı tip kontrolü korunur

Eksileri:

  • Doğru nesne mimarisi tasarlamak için daha fazla zamana ihtiyaç vardır