ProgramlamaKıdemli TypeScript Geliştirici

TypeScript'te Mapped Types nedir, esnek generic türler oluşturmak için nasıl kullanılır? Kullanımına dair incelikleri ve potansiyel tuzakları detaylandırın.

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

Cevap.

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:

  • Modifier'ları (readonly, optional) değiştirebilir, -? veya +? anahtar kelimesi ile ekleyebilir veya çıkarabilirsiniz.
  • İç içe kullanılabilir, conditional types, utility types ve generics ile birleştirilebilir.
  • Özellikle karmaşık iç içe modifikasyon ile tür hiyerarşilerinde hata ayıklamak her zaman kolay değildir.

Tüm modifikator'leri içeren bir örnek:

type PartialMutable<T> = { -readonly [K in keyof T]?: T[K]; };

Kurnaz bir soru.

"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]; };

Bilgisizlik nedeniyle gerçek hata örnekleri.


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