Mapped Types, bir türün tüm özelliklerini dinamik olarak dönüştürerek (isim değişikliği, modifikasyon) inşa edilen türlerdir. Söz dizimi, in yapısına dayanır:
type Readonly<T> = { readonly [K in keyof T]: T[K]; } type User = { name: string; age: number; } const u: Readonly<User> = { name: 'Eve', age: 22 }; u.name = 'Bob'; // Hata: name sadece okunabilir
İncelikler:
-? veya +? anahtar kelimesi ile ekleyebilir veya çıkarabilirsiniz.Tüm modifikator'leri içeren bir örnek:
type PartialMutable<T> = { -readonly [K in keyof T]?: T[K]; };
"Optional modifikatorü ile mapped type uygulandığında, bu yalnızca birinci seviye özelliklere mi etkiler yoksa iç içe objelere de mi?"
Cevap: Hayır, optional ? ile mapped type yalnızca birinci seviye özelliklere etki eder. İç içe objeleri ayrı dönüştürmek gerekir, genellikle rekürsiyon veya ek mapped types kullanılarak.
Örnek:
type DeepPartial<T> = { [K in keyof T]?: T[K] extends object ? DeepPartial<T[K]> : T[K]; };
Hikaye
Bir projede zaman tasarrufu sağlamak amacıyla standart Partial<T> kullanıldı derin form hacmi için. Ancak, ikinci ve üçüncü seviye alanlar opsiyonel hale gelmedi, bu da iç içe anahtarların yokluğunda runtime'da beklenmedik hatalara yol açtı.
Hikaye
Sadece alt nesnelerde readonly özelliklerini kaldırmak için mapped type yalnızca üst seviyeye uygulandı:
type Mutable<T> = { -readonly [K in keyof T]: T[K] }
Sonuç olarak, { readonly foo: { readonly bar: number } } türündeki alanlar iç içe kalmaya devam etti, bu da ekibi şaşırttı ve bakımı zorlaştırdı.
Hikaye
Karmaşık bir veri modelinde birden fazla utility types'yi (örneğin, Readonly & Partial gibi) kesiştirmek için iç içe mapped types uygulandı. Yanlış bileşen sırası nedeniyle beklenmedik tür uyumluluğu çatışmaları ortaya çıktı ve derleyici karmaşık hata mesajları vermeye başladı.