Interface extends — meros olish, bir nechta

~15 daq · TypeScript · Interface

Loyihada Foydalanuvchi interface bor. Admin ham foydalanuvchi — lekin qo'shimcha ruxsatlar xususiyati ham kerak:

interface Foydalanuvchi {
  id:    number;
  ism:   string;
  email: string;
}

interface Admin {
  id:         number;   // takror
  ism:        string;   // takror
  email:      string;   // takror
  ruxsatlar:  string[];
}

Foydalanuvchi ning barcha xususiyatlari Admin da qayta yozilmoqda. email ga ? qo'shish kerak bo'lsa — ikki joyni o'zgartirish kerak. extends bu muammoni hal qiladi.


extends — meros olish

extends — bir interface boshqasining barcha xususiyatlarini meros oladi va ustiga yangi xususiyatlar qo'shadi:

interface Foydalanuvchi {
  id:    number;
  ism:   string;
  email: string;
}

interface Admin extends Foydalanuvchi {
  ruxsatlar: string[]; // faqat yangi xususiyat
}

Admin endi to'rtta xususiyatga ega: id, ism, email, ruxsatlar.

const admin: Admin = {
  id:        1,
  ism:       "Jasur",
  email:     "jasur@mail.com",
  ruxsatlar: ["o'qish", "yozish", "o'chirish"],
}; // ✅ — hammasi kerak

Foydalanuvchi o'zgarsa — Admin avtomatik yangilanadi.


Hayotiy o'xshatma

Lavozim tavsifi. Har bir xodim uchun umumiy talablar bor: ism, ID, email. Menejer esa xodimning barcha talablariga ega — ustiga jamoa qo'shilgan. Menejer e'lonini yozganda "xodim talablari" ni qayta yozmaslik kerak — faqat meros olinadi.

extends — o'sha meros: mavjud tuzilmani qayta yozmay, ustiga qurish.


Bir nechta interface dan meros olish

Interface bir vaqtda bir nechta interfacedan meros olishi mumkin:

interface Timestamp {
  yaratilgan:  Date;
  yangilangan: Date;
}

interface Aktivlik {
  faol: boolean;
}

interface Foydalanuvchi extends Timestamp, Aktivlik {
  id:    number;
  ism:   string;
  email: string;
}

Foydalanuvchi endi olti xususiyatga ega: yaratilgan, yangilangan, faol, id, ism, email.


Zanjirli meros

Interface bir-birini meros olishi mumkin:

interface Shaxs {
  ism:  string;
  yosh: number;
}

interface Foydalanuvchi extends Shaxs {
  email: string;
}

interface Admin extends Foydalanuvchi {
  ruxsatlar: string[];
}

// Admin = ism + yosh + email + ruxsatlar
Shaxs
  └── Foydalanuvchi
        └── Admin

extends va xususiyat to'qnashuvi

Ota interface da bor xususiyat qayta belgilanganda — tur mos kelishi kerak:

interface A { id: number; }

interface B extends A {
  id: string; // ❌ — 'string' turi 'number' ga mos kelmaydi
}

interface B extends A {
  id: number; // ✅ — bir xil tur, muammo yo'q
}

Tez-tez uchraydigan xatolar

Har safar barcha xususiyatlarni qayta yozish:

// ❌ — takror
interface Menejer {
  id:    number;
  ism:   string;
  email: string;
  jamoa: string[];
}

// ✅ — extends bilan
interface Menejer extends Foydalanuvchi {
  jamoa: string[];
}

extends o'rniga & ishlatish:

// Intersection bilan ham ishlaydi — lekin interface extends aniqroq
type Menejer = Foydalanuvchi & { jamoa: string[] };

Interface o'zaro meros uchun extends afzalroq — xatoliklar aniqroq ko'rsatiladi.


Xulosa

interface A { x: string; }
interface B { y: number; }

interface C extends A          { z: boolean; } // A dan meros
interface D extends A, B       { z: boolean; } // ikki interfacedan
interface E extends C          { w: Date; }    // zanjirli meros

extends — mavjud interfaceni qayta yozmasdan, ustiga qurish. Foydalanuvchi o'zgarsa — barcha meros olgan interfacelar avtomatik yangilanadi.


Keyingi dars

19-dars: Function interface — chaqiriladigan tur, construct signature