Mapped types — { [K in keyof T]: ... }

~20 daq · TypeScript · Ilg'or Turlar

Foydalanuvchi turining barcha xususiyatlarini optional qilish kerak — form uchun. Har xususiyatni qo'lda ? qo'shish — juda ko'p takror. Mapped type — mavjud turdan yangi tur yaratish, har xususiyatga bir xil o'zgartirish.


Mapped type sintaksisi

type Partial<T> = {
  [K in keyof T]?: T[K];
};

K in keyof T — T ning har kaliti bo'yicha aylanib chiqadi. ? — har birini optional qiladi. T[K] — asl xususiyat turi saqlanadi.

type Foydalanuvchi = { id: number; ism: string; email: string };

type OptionalFoydalanuvchi = {
  [K in keyof Foydalanuvchi]?: Foydalanuvchi[K];
};
// { id?: number; ism?: string; email?: string }

O'zgartirishlar

// Barchani optional
type Partial<T> = { [K in keyof T]?: T[K] };

// Barchani majburiy
type Required<T> = { [K in keyof T]-?: T[K] }; // -? optional ni olib tashlaydi

// Barchani readonly
type Readonly<T> = { readonly [K in keyof T]: T[K] };

// readonly ni olib tashlash
type Mutable<T> = { -readonly [K in keyof T]: T[K] };

Tur o'zgartirish

// Barcha xususiyatlarni string ga aylantirish
type Stringified<T> = {
  [K in keyof T]: string;
};

type User = { id: number; ism: string; faol: boolean };
type StringUser = Stringified<User>;
// { id: string; ism: string; faol: string }

Kalitni o'zgartirish — as

// Getter nomlarini yaratish: ism → getIsm
type Getterlar<T> = {
  [K in keyof T as `get${Capitalize<string & K>}`]: () => T[K];
};

type User = { ism: string; yosh: number };
type UserGetterlar = Getterlar<User>;
// { getIsm: () => string; getYosh: () => number }

Shartli mapping

// Faqat string xususiyatlarni optional qilish
type OptionalStrings<T> = {
  [K in keyof T]: T[K] extends string ? T[K] | undefined : T[K];
};

type User = { id: number; ism: string; email: string };
type Result = OptionalStrings<User>;
// { id: number; ism: string | undefined; email: string | undefined }

Amaliy — Form state

type FormState<T> = {
  [K in keyof T]: {
    qiymat:  T[K];
    xato:    string | null;
    tegildi: boolean;
  };
};

type LoginForm = FormState<{ email: string; parol: string }>;
// {
//   email: { qiymat: string; xato: string | null; tegildi: boolean }
//   parol: { qiymat: string; xato: string | null; tegildi: boolean }
// }

Xulosa

// Asosiy sintaksis
type MyMapped<T> = {
  [K in keyof T]: T[K];       // aynan nusxa
  [K in keyof T]?: T[K];      // optional
  readonly [K in keyof T]: T[K]; // readonly
  [K in keyof T]-?: T[K];     // non-optional (-?)
  -readonly [K in keyof T]: T[K]; // non-readonly (-readonly)
  [K in keyof T as `prefix_${string & K}`]: T[K]; // kalit o'zgartirish
};

Keyingi dars

46-dars: Conditional types — T extends U ? X : Y