Intersection turlar — & operatori, mixin pattern

~15 daq · TypeScript · Asosiy Turlar

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