İndeksli Erişim Türleri (ya da indeks üzerinden erişim türleri), T[K] sözdizimi ile bir nesnenin belirli bir özelliğinin veya herhangi bir anahtarının türüne atıfta bulunmamıza olanak tanır. Bu, esnek ve tip güvenli soyutlamalar oluşturmak için güçlü bir araçtır.
type Kişi = { ad: string; yaş: number; }; type AdTürü = Kişi['ad']; // string type YaşYadaAd = Kişi['yaş' | 'ad']; // number | string
Kapsamlı türler ve fonksiyonlar yazmak için kullanılır:
function getProperty<T, K extends keyof T>(obj: T, key: K): T[K] { return obj[key]; // dönüş türü doğru bir şekilde tanımlanmış } const kullanıcı = { email: 'a@a.ru', id: 1 }; let id = getProperty(kullanıcı, 'id'); // id: number
Kişi['maaş'] — derleme aşamasında hata verir.Soru: type Foo = {a: number, b: string}["a" | "b" | "c"] ifadesinin türü ne olur?
Cevap: Bu örnek, 'c' anahtarının erişim sağlanan türde olmadığı için derleme hatası verecektir. TypeScript hata verecektir:
Type '"c"' does not satisfy the constraint '"a" | "b"'.
Hikaye
Projede, türlere dayalı olarak dinamik formlar oluşturuluyordu. Ana türe yeni bir alan eklenince, anahtarlarla indeksleme yapılan yerler güncellenmedi, sonuç olarak bazı özellikler forma dahil edilmedi, oysa tip düzeyinde tam bir eşleme bekleniyordu. Hata yalnızca çalışma zamanında ortaya çıktı, geliştirme aşamasında değil.
Hikaye
Verileri doğrulama kütüphanesinde indeksli erişim türleri kullanıldı, ancak kodun taşınması sırasında anahtarlardan biri nesneden üst öğeye alındı. Eski indeksli tür derleme hatasına neden oldu, ancak hata yalnızca CI'deki önbellek nedeniyle yeniden derlenince ortaya çıktı ve bundan önce staging üzerinde birkaç hafta boyunca yaşadı.
Hikaye
İndeksli Erişim Türleri sayesinde, açıkça belirtilmemiş olan herhangi bir anahtara erişilebileceği yanlış varsayıldı ve bu, dinamik özellikler için otomatik testlerin yanlış oluşturulmasına yol açtı. Sonuç olarak, testler olası senaryoların bir kısmını kapsamadı, çünkü derleyici bu durumları geçersiz olarak dışladı.