Optional (?), readonly, Index signature

~20 daq · TypeScript · Interface

Foydalanuvchi profili interfaceni yozyapsiz. Ba'zi xususiyatlar majburiy, ba'zilari ixtiyoriy, ba'zilari o'zgarmasligi kerak:

  • id — har doim bor, o'zgarmasligi kerak
  • ism — majburiy
  • bio — bo'lishi ham, bo'lmasligi ham mumkin
  • sozlamalar — kalitlari oldindan noma'lum

Bu to'rta holat uchun interface da to'rta turli yozuv bor.


Optional xususiyat — ?

? — xususiyat bo'lishi ham, bo'lmasligi ham mumkin. Bo'lmasa undefined bo'ladi.

interface Profil {
  ism:  string;   // majburiy
  bio?: string;   // ixtiyoriy — string | undefined
}

const p1: Profil = { ism: "Jasur" };                  // ✅ bio yo'q
const p2: Profil = { ism: "Jasur", bio: "Developer" }; // ✅ bio bor

Optional xususiyatni ishlatishdan oldin tekshirish shart:

function bioCo_rsatish(p: Profil): string {
  return p.bio.toUpperCase();
  // ❌ Object is possibly 'undefined'
}

function bioCo_rsatish(p: Profil): string {
  return p.bio ? p.bio.toUpperCase() : "Bio yo'q"; // ✅
}

readonly — o'zgarmaydigan xususiyat

readonly — xususiyat faqat bir marta, yaratilishda beriladi. Keyin o'zgartirib bo'lmaydi.

interface Foydalanuvchi {
  readonly id:  number;  // o'zgarmasligi kerak
  ism:          string;  // o'zgarishi mumkin
}

const user: Foydalanuvchi = { id: 1, ism: "Jasur" };

user.ism = "Vali"; // ✅ — ism o'zgarishi mumkin
user.id  = 2;      // ❌ — Cannot assign to 'id' because it is a read-only property

Hayotiy o'xshatma

Pasport seriya raqami. Berilgandan keyin o'zgartirib bo'lmaydi — faqat o'qish mumkin. readonly — o'sha kafolat: "bu qiymat birinchi berilganda belgilanadi va o'zgarmaydi."


Index signature — noma'lum kalitlar

Ba'zan ob'ektda qanday kalitlar bo'lishi oldindan noma'lum. Masalan, sozlamalar ob'ekti:

interface Sozlamalar {
  [kalit: string]: string;
}

const sozlamalar: Sozlamalar = {
  til:    "uz",
  mavzu:  "qorong'i",
  shrift: "JetBrains Mono",
};

sozlamalar.til            // ✅ — string
sozlamalar.mavjud_emas    // ✅ — TypeScript ruxsat beradi (string deb biladi)

Raqamli kalit ham mumkin:

interface Ro_yxat {
  [indeks: number]: string;
}

const ro_yxat: Ro_yxat = { 0: "birinchi", 1: "ikkinchi" };

Hammasini birga

interface Foydalanuvchi {
  readonly id:    number;          // o'zgarmaydigan
  ism:            string;          // majburiy
  email:          string;          // majburiy
  bio?:           string;          // ixtiyoriy
  [kalit: string]: unknown;        // qo'shimcha ixtiyoriy kalitlar
}

[!WARNING] Index signature barcha xususiyatlarning turi bilan mos kelishi kerak. Yuqoridagi misolda unknown ishlatilgan — string bilan berilsa, id: number va bio?: string mos kelmay xato chiqadi.


Tez-tez uchraydigan xatolar

Optional xususiyatni tekshirmay ishlatish:

interface Kurs { nomi: string; tavsif?: string; }

function chiqar(k: Kurs) {
  return k.tavsif.length; // ❌ — undefined bo'lishi mumkin
}

function chiqar(k: Kurs) {
  return k.tavsif?.length ?? 0; // ✅
}

readonly ni const bilan chalkashtirib yuborish:

interface Config { readonly port: number; }

const config: Config = { port: 3000 };
config.port = 4000; // ❌ — readonly

// Lekin:
const config2 = { port: 3000 };
config2.port = 4000; // ✅ — bu oddiy ob'ekt, readonly emas

readonly faqat interface orqali berilganda ishlaydi.


Xulosa

xususiyat:  Tur      — majburiy
xususiyat?: Tur      — ixtiyoriy (string | undefined)
readonly x: Tur      — faqat o'qish, o'zgartirib bo'lmaydi
[k: string]: Tur     — noma'lum kalitlar uchun index signature
interface Profil {
  readonly id: number;     // bir marta beriladi
  ism:         string;     // har doim bo'lishi kerak
  bio?:        string;     // bo'lishi ham, bo'lmasligi ham mumkin
  [k: string]: unknown;    // qo'shimcha kalitlar
}

Keyingi dars

18-dars: Interface extends — meros olish, bir nechta