ProgramlamaFullstack geliştirici

TypeScript'te dinamik olarak özelliklere ek erişim mekanizması (Index Signature) nasıl çalışır? Ne için kullanılır ve temel tuzaklar nelerdir?

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

Cevap.

Index Signature, önceden bilinemeyen (veya dinamik olarak eklenebilen) anahtarların bulunduğu nesne türlerini tanımlama mekanizmasıdır ve değerler belirli bir türe karşılık gelir. Derleme aşamasında özelliklerin listesi bilinmeyen kelime dağarcığı (map/dictionary) nesneleri oluşturmaya olanak tanır.

Sürecin geçmişi: JavaScript'te nesneler genellikle ilişkilendirilmiş diziler (associative arrays) olarak işlev görür. TypeScript’in statik tipi, anahtarlar ve değerler için türlerin belirtilmesini gerektirir. Index Signature, anahtarın katı bir özellik değil, bir dize (veya sayı) olduğu ve değerlerin belirli bir türde olduğunu tanımlamak için en önemli sorunu çözer.

Sorun: Bu tür nesnelerle çalışırken, nesnenin bilinen özellikleri index signature ile çelişebilir veya belirli özellikler hakkında bilgi kaybolabilir. Miras alınan türler ve kelime dağarcığı yapısının genişletilmesi ile ilgili nüanslar vardır.

Çözüm: Index Signature, genellikle anahtarı string veya number tipi olan dinamik özellikleri tanımlamak için kullanılır; örneğin koleksiyonlar, önbellek nesneleri veya API cevapları için { [key: string]: T } türünde. Tür üzerinde kontrol sağlamak için, hem sabit özellikleri hem de index signature'ı aynı anda tanımlamak gerekir ya da gerekirse union türleri oluşturulmalıdır.

Kod örneği:

interface StringNumberMap { [key: string]: number; } const map: StringNumberMap = { apples: 2, oranges: 5, bananas: 3 };

Anahtar özellikler:

  • Dinamik özellik seti ile nesneleri tanımlamaya olanak tanır
  • Anahtar string, number, symbol olabilir
  • Index signature, nesnenin tüm özelliklerinin tipini etkiler

Kandırıcı Sorular.

Index signature'a sahip bir arayüze uyumsuz türde sabit bir özellik eklenirse ne olur?

TypeScript, özellik türü index signature'da belirtilen türle uyumlu değilse bir hata verecektir.

interface BadDict { [key: string]: number; error: string; // Hata: string number ile uyumlu değil }

Farklı anahtar türlerine (number ve string) sahip birden fazla index signature tanımlanabilir mi?

Evet, tanımlanabilir, ancak bir incelik vardır: TypeScript'te number türü anahtarları otomatik olarak dizeye dönüştürülür. number türünde bir index signature, sadece string anahtarların takma adıdır.

interface NumStrDict { [key: string]: number; [key: number]: number; }

Index signature'daki değer için union türleri veya arayüzler kullanılabilir mi?

Evet, değer bir union türü veya arayüz olabilir. Bu şekilde karmaşık nesne kelime dağarcıkları tanımlanabilir.

interface Dict { [key: string]: string | number; }

Tipik Hatalar ve Anti-deseni

  • Sabit özelliklerin ve index signature'ın tür uyuşmazlığı
  • Herhangi bir türde değer kullanımı (örneğin, [key: string]: any)
  • Belgelendirmede boşluklar, hangi anahtarın olabileceği belirsizdir

Gerçek Hayattan Örnek

Olumsuz Durum

API cevabı arayüzünde [key: string]: any kullanıldı. Daha sonra döndürülen nesne farklı yapılar içeren veriler içeriyordu, bu da çalışma zamanında hatalara ve kodun bakımını zorlaştırdı.

Artılar:

  • Rastgele bir yapıyı hızlı bir şekilde tanımlamak
  • Kullanımda kolaylık

Eksiler:

  • Tip hatası yapma olasılığı yüksek
  • Nesne yapılandırmalarının belirsizliği

Olumlu Durum

Kullanıcı id'sinin (string) anahtar olduğu, değerlerin ise kesin bir türde (örneğin, UserData) olduğu önbellek nesnesinin arayüzünü tanımladık:

interface UserCache { [userId: string]: UserData; }

Artılar:

  • Kesin tip tanımlaması
  • Kolay kullanma ve genişletme

Eksiler:

  • Anahtarların yanlış kullanılmasına karşı korunmaz
  • Sabit özelliklerle birleştirmesi zor olabilir