Optional (?), readonly, Index signature
Foydalanuvchi profili interfaceni yozyapsiz. Ba'zi xususiyatlar majburiy, ba'zilari ixtiyoriy, ba'zilari o'zgarmasligi kerak:
id— har doim bor, o'zgarmasligi kerakism— majburiybio— bo'lishi ham, bo'lmasligi ham mumkinsozlamalar— 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
unknownishlatilgan —stringbilan berilsa,id: numbervabio?: stringmos 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