readonly xususiyatlar va parameter properties

~15 daq · TypeScript · OOP

Foydalanuvchi classida id bir marta berilgandan keyin o'zgarmasligi kerak. readonly — xususiyat faqat constructorda beriladi, keyin o'zgartirib bo'lmaydi.


readonly xususiyat

class Foydalanuvchi {
  readonly id: number;
  ism: string;

  constructor(id: number, ism: string) {
    this.id  = id;   // ✅ — constructorda berish mumkin
    this.ism = ism;
  }

  ismniOzgartir(yangiIsm: string): void {
    this.ism = yangiIsm; // ✅ — ism readonly emas
    this.id  = 99;       // ❌ — Cannot assign to 'id' because it is a read-only property
  }
}

const u = new Foydalanuvchi(1, "Jasur");
u.ism = "Vali"; // ✅
u.id  = 2;      // ❌ — readonly

Parameter properties — qisqa yozuv

Constructor parametriga modifier qo'shilsa — xususiyat e'lon va tayinlash avtomatik:

// Uzun yozuv
class Mahsulot {
  id:    number;
  nomi:  string;
  narxi: number;

  constructor(id: number, nomi: string, narxi: number) {
    this.id    = id;
    this.nomi  = nomi;
    this.narxi = narxi;
  }
}

// Qisqa yozuv — parameter properties
class Mahsulot {
  constructor(
    public    id:    number,
    public    nomi:  string,
    public    narxi: number,
  ) {}
  // e'lon + tayinlash avtomatik
}

Ikkalasi bir xil natija beradi.


readonly parameter property

class Config {
  constructor(
    public  readonly host: string,
    public  readonly port: number,
    private readonly ssl:  boolean,
  ) {}

  ulanish(): string {
    return `${this.ssl ? "https" : "http"}://${this.host}:${this.port}`;
  }
}

const cfg = new Config("localhost", 5432, true);
cfg.host = "boshqa"; // ❌ — readonly
cfg.ssl;             // ❌ — private
cfg.ulanish();       // ✅

Aralash yozuv — ba'zi parameter property, ba'zi oddiy

class Foydalanuvchi {
  readonly yaratilgan: Date = new Date(); // initializator — parameter property emas

  constructor(
    public readonly id:    number,
    public          ism:   string,
    private         parol: string, // tashqaridan yashirin
  ) {}

  parolTekshir(p: string): boolean {
    return this.parol === p;
  }
}

Tez-tez uchraydigan xatolar

readonly ni constructordan keyin o'zgartirishga urinish:

class A {
  readonly x: number;
  constructor(x: number) { this.x = x; }

  yangilash(n: number) {
    this.x = n; // ❌ — constructor tashqarida
  }
}

Parameter property va qo'lda e'lonni birga:

class A {
  ism: string; // ❌ — duplikat, parameter property bilan

  constructor(public ism: string) {} // qo'lda e'lon shart emas
}

Xulosa

class Example {
  readonly tarixiy: Date = new Date(); // initializator

  constructor(
    public    readonly id:    number, // readonly param property
    public             ism:   string, // oddiy param property
    private            sir:   string, // private param property
    protected readonly kod:   number, // protected readonly
  ) {}
}

Parameter property — xususiyat e'lon + constructor tayinlashni qisqartiradi. readonly — faqat constructorda qiymat olinadi.


Keyingi dars

41-dars: Getter va Setter — TypeScript da