TypeScript Notları
  • Giriş
  • Handbook
    • TypeScript nedir, ne işe yarar ?
    • Kurulum ve tsc
    • Temel Tipler
    • any ve unknown
    • Union Type (Çoklu Tipler)
    • Literal Types
    • Objects (Objeler)
    • Arrays (Diziler)
    • Tuple
    • Fonksiyonlar
    • Optional Params (Opsiyonel Parametreler)
    • type
    • interface
    • readonly
    • Generics
    • Modül Yapısı
    • Type Assertion
    • keyof, typeof
    • Mapped Types
    • React ve TypeScript
      • Props Tipleri
      • State Tipleri
      • Event Tipleri
      • useRef
  • Tip and Tricks
    • json2ts
  • Kaynakça
Powered by GitBook
On this page
  1. Handbook

Mapped Types

Previouskeyof, typeofNextReact ve TypeScript

Last updated 3 years ago

Mapped Types konusunu öğrenmeden önce , , ve konuları hakkında bilgi sahibi olmak gerekir.

Diyelim ki elimizde aşağıdaki gibi bir tip objesi var

interface Artist {
    id?: number;
    name?: string;
    bio?: string;
    birthDate?: string;
    country?: string;
}

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.

type Properties = 'a' | 'b' | 'c';

Şeklinde bir 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.

type NewType = { [P in Properties]: number };

NewType tipinin karşılığı aşağıdaki gibidir.

type NewType = {
  a: number;
  b: number;
  c: number;
 }
interface Artist {
    id?: number;
    name?: string;
    bio?: string;
    birthDate?: string;
    country?: string;
}
type MyPartialType<T> = {
    [P in keyof T]-?: T[P];
};

type MappedArtistForEdit = MyPartialType<Artist>;
[id ?, name ?, bio ?, birthDate ?, country ?]
  • [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.

interface I {
  a: string;
  b: number;
}

type PropertyA: I['a'] nın karşılığı nedir ? Doğru cevap gözlerinizi aşağıya kaydırmanız yeterli 😀

type PropertyA = string;

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.

type MappedArtistForEdit = {
    id: number;
    name: string;
    bio: string;
    birthDate: string;
    country: string;
}

Gelelim işleri biraz daha karıştırmaya. Sayfanın en başında aşağıdaki i oluşturmuştuk. Mapped Type özelliğini kullanarak özelliğini içerisindeki tüm elemanlardan kaldırmak istiyorum.

Öncelikle mapped type özelliğini kullanabileceğim bir 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 ile tip objesi içerisindeki key leri elde edebildiğimizi öğrenmiştik.[ P in keyof T] nin karşılığı aşağıdaki gibidir.

interface
optional parametre
interface
generic
Generics
readonly
optional params
union tip
keyof
keyof