Object tur — inline tipizatsiya, nested object
Foydalanuvchi ma'lumotini funksiyaga o'tkazmoqchisiz. JavaScript da bu oddiy ob'ekt:
function salomlash(foydalanuvchi) {
return `Salom, ${foydalanuvchi.ism}!`;
}
Lekin foydalanuvchi ichida nima bo'lishi kerak? ism matnmi, sonmi? yosh bo'lishi shartmi? TypeScript da ob'ektning turini aniq belgilash mumkin — va shunda muharrir hamma narsani biladi.
Inline ob'ekt tur
Ob'ekt turini to'g'ridan-to'g'ri parametr yonida yozish — inline tipizatsiya:
function salomlash(foydalanuvchi: { ism: string; yosh: number }): string {
return `Salom, ${foydalanuvchi.ism}! Yosh: ${foydalanuvchi.yosh}`;
}
Endi TypeScript bir nechta narsani kafolatlaydi:
ism— faqat matnyosh— faqat son- Boshqa xususiyatlar — ruxsat yo'q (agar belgilanmagan bo'lsa)
salomlash({ ism: "Jasur", yosh: 25 }); // ✅
salomlash({ ism: "Jasur" }); // ❌ — yosh yetishmayapti
salomlash({ ism: "Jasur", yosh: "25" });// ❌ — yosh number bo'lishi kerak
Optional xususiyat — ?
Ba'zi xususiyatlar majburiy emas. ? qo'shilsa — bo'lishi ham, bo'lmasligi ham mumkin:
function profil(user: { ism: string; bio?: string }): string {
return user.bio ? `${user.ism}: ${user.bio}` : user.ism;
}
profil({ ism: "Jasur" }); // ✅ — bio yo'q, lekin ruxsat
profil({ ism: "Jasur", bio: "Backend" }); // ✅ — bio bor
Optional xususiyat undefined bo'lishi mumkin — ishlatishdan oldin tekshirish kerak.
Nested object — ichma-ich ob'ekt
Hayotiy o'xshatma
Foydalanuvchi kartochkasi. Ustida ism, yosh. Lekin manzil — alohida blok: shahar, ko'cha, uy raqami. Bu ichma-ich tuzilma — nested object.
function manzilChiqar(user: {
ism: string;
manzil: {
shahar: string;
ko_cha: string;
uy: number;
};
}): string {
return `${user.ism} — ${user.manzil.shahar}, ${user.manzil.ko_cha} ${user.manzil.uy}`;
}
manzilChiqar({
ism: "Jasur",
manzil: { shahar: "Toshkent", ko_cha: "Navoiy", uy: 15 }
}); // ✅
TypeScript nested ob'ektning ichini ham tekshiradi.
Inline tipizatsiya qachon chalkashadi
Inline yozuv qisqa funksiyalar uchun yaxshi. Lekin bir xil tuzilma ko'p joyda kerak bo'lsa — kodni qayta-qayta yozish kerak bo'ladi:
function salomlash(user: { ism: string; yosh: number }) { ... }
function saqlash(user: { ism: string; yosh: number }) { ... }
function yangilash(user: { ism: string; yosh: number }) { ... }
Bir joyda o'zgartirish kerak bo'lsa — hammasini o'zgartirish kerak. Bu — type alias ishlatish belgisi. Keyingi darsda ko'ramiz.
Qo'shimcha xususiyat tekshiruvi
TypeScript ob'ektni to'g'ridan-to'g'ri yozganda qo'shimcha xususiyatlarni rad etadi:
function salomlash(user: { ism: string }): void { ... }
salomlash({ ism: "Jasur", yosh: 25 });
// ❌ — 'yosh' bu yerda kutilmagan, TypeScript qabul qilmaydi
Lekin alohida o'zgaruvchi orqali bersangiz — ruxsat:
const malumot = { ism: "Jasur", yosh: 25 };
salomlash(malumot); // ✅ — qo'shimcha xususiyat tekshirilmaydi
Bu TypeScript ning ataylab qilingan xususiyati — strukturaviy mos kelish (structural typing). Ob'ekt zarur xususiyatlarga ega bo'lsa — mos keladi.
Tez-tez uchraydigan xatolar
Optional xususiyatni tekshirmay ishlatish:
function bio(user: { ism: string; tavsif?: string }): string {
return user.tavsif.toUpperCase();
// ❌ — user.tavsif undefined bo'lishi mumkin
}
// ✅ — avval tekshirish
function bio(user: { ism: string; tavsif?: string }): string {
return user.tavsif ? user.tavsif.toUpperCase() : user.ism;
}
Nested ob'ektda chuqur murojaat:
const user: { manzil?: { shahar: string } } = {};
console.log(user.manzil.shahar);
// ❌ — manzil undefined bo'lishi mumkin
console.log(user.manzil?.shahar); // ✅ — optional chaining
Xulosa
Inline ob'ekt tur — { ism: string; yosh: number } — to'g'ridan-to'g'ri yoziladi. TypeScript har bir xususiyatning turini va mavjudligini tekshiradi.
? — xususiyatni ixtiyoriy qiladi. Ixtiyoriy xususiyat ishlatishdan oldin tekshiriladi.
Nested object — ichma-ich ob'ekt. TypeScript har bir qavatni tekshiradi.
Bir xil tuzilma ko'p joyda kerak bo'lsa — type alias ishlatiladi.
Keyingi dars
11-dars: Type alias — yaratish, ishlatish, kengaytirish