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.
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.
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:
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.
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ı:
Eksileri:
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ı:
Eksileri: