TypeScript'da readonly qanday ishlaydi?
Savol
TypeScript'da readonly modifikatori qanday ishlaydi?
Qisqa javob
readonly obyekt xususiyati yoki massiv elementini initsializatsiyadan keyin qayta tayinlashni taqiqlaydi — lekin bu faqat kompilyatsiya bosqichidagi tekshiruv, kompilyatsiya qilingan JavaScript'da hech qanday himoya qolmaydi.
Batafsil javob
readonlyni quyidagilarga qo'llash mumkin:
- Interfeys/tip xususiyatiga — qiymatni faqat bir marta o'rnatish mumkin (obyekt literalida yoki klass konstruktorida), keyin tayinlash kompilyator tomonidan taqiqlanadi.
- Massivga —
readonly T[]yokiReadonlyArray<T>mutatsiya qiluvchi metodlarni (push,pop,splice, indeks bo'yicha tayinlash) taqiqlaydi. - Klass maydoniga — faqat e'lon qilishda yoki konstruktor ichida o'rnatish mumkin.
Muhim nuqta: readonly — sayoz (shallow) himoya. Agar xususiyat obyekt bo'lsa, readonly obyektning o'zini qayta tayinlashni taqiqlaydi, lekin uning ichki maydonlarini o'zgartirishni taqiqlamaydi.
Yana shuni esda tutish kerak: bu sof kompilyator darajasidagi tip tekshiruvi (JS'ga transpilyatsiyada o'chib ketadi), Object.freeze() kabi runtime himoyasi emas — oddiy JavaScript kodida yoki tip keltirilgandan keyin readonlyni chetlab o'tish mumkin.
Misol
interface User {
readonly id: number
name: string
address: { city: string }
}
const user: User = { id: 1, name: 'Alice', address: { city: 'Tashkent' } }
user.name = 'Bob' // OK
user.id = 2 // Error: Cannot assign to 'id' because it is a read-only property
user.address.city = 'Samarkand' // OK — readonly chuqur emas (shallow)
const nums: readonly number[] = [1, 2, 3]
nums.push(4) // Error: Property 'push' does not exist on type 'readonly number[]'
class Point {
readonly x: number
constructor(x: number) {
this.x = x // OK — konstruktorda tayinlashga ruxsat berilgan
}
}
Qo'shimcha savollar
- TypeScript'dagi
readonlyruntime'dagiObject.freeze()dan nimasi bilan farq qiladi? - Obyektning ichki maydonlarini ham o'zgarmas (chuqur readonly) qilish uchun nima qilish kerak?
Readonly<T>utility-tipi nima qiladi?