Mapped types — { [K in keyof T]: ... }
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