Object tur — inline tipizatsiya, nested object

~15 daq · TypeScript · Asosiy Turlar

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 matn
  • yosh — 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