Mapped Types — TypeScript-in qabaqcıl xüsusiyyətlərindən biridir və mövcud obyektlərin açarlarını (yəni keyof) istifadə edərək yeni tip yarada bilməyə imkan verir. Bu xüsusiyyət əsasən reusable və dinamik tiplər yaratmaq üçün istifadə olunur.
1. Əsas sintaksis və istifadə
Mapped Type yaratmaq üçün aşağıdakı sintaksisdən istifadə olunur:
type MyMappedType<T> = {
[P in keyof T]: T[P];
};
Bu o deməkdir ki, T tipində olan obyektin hər bir açarı (P) üçün həmin açarın tipi saxlanılır.
Məsələn:
type User = {
name: string;
age: number;
};
type ReadonlyUser = {
readonly [P in keyof User]: User[P];
};
// nəticə:
// {
// readonly name: string;
// readonly age: number;
// }
2. Sadə misallar
a) Readonly
type Readonly<T> = {
readonly [K in keyof T]: T[K];
};
b) Partial
type Partial<T> = {
[K in keyof T]?: T[K];
};
c) Required
type Required<T> = {
[K in keyof T]-?: T[K];
};
3. as ilə Key Rename (Advanced Feature)
type RemoveUnderscore<T> = {
[K in keyof T as K extends `_${infer R}` ? R : K]: T[K];
};
type User = {
_id: string;
name: string;
};
type CleanUser = RemoveUnderscore<User>;
// Nəticə:
// {
// id: string;
// name: string;
// }
Burada as operatoru ilə _${infer R} pattern-i ilə başlayan açarları R şəklində dəyişmişik.
4. Record Mapped Type kimi
type Record<K extends keyof any, T> = {
[P in K]: T;
};
const roles: Record<"admin" | "user", boolean> = {
admin: true,
user: false,
};
5. Real həyatdan misal
Form input-lar üçün model yaradın:
type FormFields = {
email: string;
password: string;
};
type FormErrors = {
[K in keyof FormFields]?: string;
};
Bu halda FormErrors tipində email və password sahələri olacaq, amma optional və dəyərləri string olacaq.