TypeScript'da readonly qanday ishlaydi?

MiddleTypeScript #typescript

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[] yoki ReadonlyArray<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 readonly runtime'dagi Object.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?