Intersection turlar — & operatori, mixin pattern
Loyihada Foydalanuvchi turi bor. Endi API javoblarida foydalanuvchi ma'lumotlari bilan birga id va createdAt ham keladi — lekin bu ikki xususiyat boshqa turlarda ham kerak: mahsulot, buyurtma, xabar...
Har safar alohida yozish o'rniga — bu umumiy xususiyatlarni alohida tur sifatida ajratib, boshqa turlarga birlashtirish kerak. Bu — Intersection tur.
Intersection tur nima?
& operatori ikki turni birlashtiradi. Natijada ikkala turning barcha xususiyatlari kerak bo'ladi.
A & B → A ning barcha xususiyatlari + B ning barcha xususiyatlari
type A = { ism: string };
type B = { yosh: number };
type C = A & B; // { ism: string; yosh: number }
const kishi: C = { ism: "Jasur", yosh: 25 }; // ✅ — ikkalasi ham kerak
const kishi: C = { ism: "Jasur" }; // ❌ — yosh yetishmayapti
Hayotiy o'xshatma
Ish shartnomasi. Birinchi qism — barcha xodimlar uchun standart: to'lov shartlari, ta'til kunlari, ichki qoidalar. Ikkinchi qism — shu xodimga xos: lavozim, bo'lim, vazifalar. Ikkalasi birlashib — to'liq shartnoma hosil bo'ladi.
& — o'sha birlashish: ikkala qismning hammasi bo'lishi shart.
Union va Intersection — vizual farq
Union A | B → A YOKI B (kamida biri)
{ ism } | { yosh }
→ ya ism bor, ya yosh bor
Intersection A & B → A VA B (ikkalasi ham)
{ ism } & { yosh }
→ ham ism, ham yosh bo'lishi kerak
Umumiy xususiyatlarni ajratish
Amaliy holat — database dan keladigan har bir ob'ektda id va yaratilgan bo'ladi. Buni alohida tur sifatida ajratib, boshqa turlarga qo'shish:
type DBSatri = {
id: number;
yaratilgan: Date;
yangilangan: Date;
};
type Foydalanuvchi = DBSatri & {
ism: string;
email: string;
};
type Mahsulot = DBSatri & {
nomi: string;
narxi: number;
};
Endi Foydalanuvchi = id + yaratilgan + yangilangan + ism + email.
DBSatri bir joyda — o'zgarish kerak bo'lsa, faqat shu yerda.
Mixin pattern
Mixin — mustaqil xususiyat guruhlarini bir ob'ektga birlashtirish. Har bir guruh alohida tur — keraklilarini & bilan qo'shiladi:
type Saqlanuvchi = {
saqlash(): void;
yuklash(): void;
};
type Loglanuvchi = {
log(xabar: string): void;
};
type Validatsiyalanuvchi = {
tekshir(): boolean;
};
type Xizmat = Saqlanuvchi & Loglanuvchi & Validatsiyalanuvchi;
Xizmat turini amalga oshirgan ob'ekt uchta guruhning barcha metodlariga ega bo'ladi. Har bir guruh alohida testlanishi, alohida ishlatilishi mumkin.
Bir xil nom, turli tur — to'qnashuv
Ikkala turda bir xil nomda xususiyat bo'lsa — turlar mos kelishi kerak. Mos kelmasa, never hosil bo'ladi:
type A = { id: number };
type B = { id: string };
type C = A & B;
// C.id turi: number & string → never (hech qachon bo'lmaydi)
const ob: C = { id: 1 }; // ❌ — id never tur, hech qiymat mos kelmaydi
Bu muammo: birlashtirishdan oldin nomlar bir xil bo'lmasligi tekshiriladi.
Intersection vs kengaytirilgan type alias
Ikki yondashuv bor — natija bir xil:
// 1 — Intersection bilan
type A = { ism: string };
type B = A & { yosh: number };
// 2 — Qayta yozish bilan
type B = { ism: string; yosh: number };
Birinchi usul — A ga bog'liq. A o'zgarsa — B ham o'zgaradi. Ikkinchi usul — mustaqil, ammo kod takrorlanishi mumkin.
Umumiy qoidalar bo'lsa — birinchi usul. Aks holda — ikkinchi.
Tez-tez uchraydigan xatolar
Union bilan Intersection ni chalkashtirib yuborish:
type Javob = { kod: number } & { xabar: string };
const j: Javob = { kod: 200 };
// ❌ — xabar ham kerak! & dan keyin ikkalasi ham majburiy
| — biri yetarli. & — ikkalasi ham bo'lishi shart.
Bir xil nom, mos kelmaydigan tur:
type X = { qayta: () => void } & { qayta: string };
// X.qayta turi: never — funksiyami yoki stringmi? Hech biri emas.
Xulosa
& — ikki turni birlashtiradi. Natijada ikkala turning barcha xususiyatlari majburiy.
Umumiy xususiyatlar (id, yaratilgan, ...) alohida turga ajratilib, & bilan qo'shiladi. Bir joyda o'zgarish — hamma joyda yangilanadi.
Mixin pattern: mustaqil xususiyat guruhlari & bilan birlashtiriladi.
| va & ni chalkashtirmang: | — biri yetarli, & — ikkalasi ham kerak.
Keyingi dars
14-dars: Literal turlar — 'qizil' | 42 | true, as const