Mapped Types
Mapped Types konusunu öğrenmeden önce Generics, keyof, readonly ve optional params konuları hakkında bilgi sahibi olmak gerekir.
Diyelim ki elimizde aşağıdaki gibi bir tip objesi var
ve bu biz objedeki tüm optional parametre ifadesi olan ?
lerini kaldırmak istiyoruz. Ne yaparsınız ? Tek tek mi değiştirirsiniz ? Yoksa bunu yapan bir yöntem var mıdır ? İşte TypeScript in mapped types özelliği burada devreye giriyor.
[Propery in Type ] : type
syntax i ile tip nesnesi içerisinde property lerini map edebiliyoruz. Okuyunca çok karışık oldu haklısınız. En iyi yine örnekler açıklayalım.
Şeklinde bir union tip tanımlamamız olsun. Yeni bir tip tanımlamak istiyorum, key leri Properties objesinde ki keyler olsun, tip değerleri de number olmasını istiyorum. Bunu yapmak için Mapped type özelliğini kullanabilirim.
Aşağıdaki örneği inceleyelim.
NewType tipinin karşılığı aşağıdaki gibidir.
Gelelim işleri biraz daha karıştırmaya. Sayfanın en başında aşağıdaki interface i oluşturmuştuk. Mapped Type özelliğini kullanarak optional parametre özelliğini interface içerisindeki tüm elemanlardan kaldırmak istiyorum.
Öncelikle mapped type özelliğini kullanabileceğim bir generic type oluşturuyorum ve burada mapped type özelliğini kullanıyorum. Ardından oluşturduğum generic tip e , generic olarak Artist tip ini vererek yeni bir tip oluşturuyorum. Gelin adım adım nasıl çalıştığını anlatalım.
Daha önceden keyof ile tip objesi içerisindeki key leri elde edebildiğimizi öğrenmiştik.
[ P in keyof T]
nin karşılığı aşağıdaki gibidir.
[P in keyof T]
nin hemen yanında-?
var.-?
optional parametre özelliğini kaldırmamıza yarıyor.T[P]
ise type objemizde ki keylerin sırasıyla karşılığındaki tipleri bize veriyor. Örneğin aşağıdaki gibi bir I isimli interface miz olsun.
type PropertyA: I['a']
nın karşılığı nedir ? Doğru cevap gözlerinizi aşağıya kaydırmanız yeterli 😀
Tekrardan T[P]
i açıklamaya dönelim. Bu durumda T[P]
karşılığı, T objesinde ki her key in tip karşılığı olucaktır.
Yapılan işlem sonrası type MappedArtistForEdit
in karşılığı aşağıdaki gibi olacaktır.
Last updated