Interface extends — meros olish, bir nechta
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