Access modifiers — public, private, protected

~20 daq · TypeScript · OOP

BankHisobi classida balans xususiyati bor. Tashqaridan to'g'ridan o'zgartirish xavfli — salbiy qoldiq bo'lib qolishi mumkin:

const hisob = new BankHisobi(1000);
hisob.balans = -500; // ❌ — mantiqan noto'g'ri, lekin TypeScript ruxsat beradi

Access modifiers — xususiyat va metodlarga kirish huquqini belgilash.


public — har joydan kirish (standart)

Barcha xususiyat va metodlar standart public — alohida yozish shart emas:

class Foydalanuvchi {
  public ism: string;    // explicit
  email: string;         // ham public (standart)

  public salomlash(): string {
    return `Salom, ${this.ism}!`;
  }
}

const u = new Foydalanuvchi();
u.ism;        // ✅ tashqaridan
u.salomlash(); // ✅ tashqaridan

private — faqat class ichidan

class BankHisobi {
  private balans: number;

  constructor(boshlangich: number) {
    this.balans = boshlangich;
  }

  kiritish(summa: number): void {
    if (summa <= 0) throw new Error("Summa musbat bo'lishi kerak");
    this.balans += summa;
  }

  olish(summa: number): void {
    if (summa > this.balans) throw new Error("Mablag' yetarli emas");
    this.balans -= summa;
  }

  ko_rish(): number {
    return this.balans;
  }
}

const hisob = new BankHisobi(1000);
hisob.kiritish(500);
hisob.ko_rish();    // 1500 ✅
hisob.balans;       // ❌ — private, tashqaridan kirish yo'q
hisob.balans = -500; // ❌ — private

protected — class va voris

private + meros olgan classlarda ham kirish mumkin:

class Hayvon {
  protected ism: string;

  constructor(ism: string) {
    this.ism = ism;
  }

  protected tavsif(): string {
    return `Hayvon: ${this.ism}`;
  }
}

class It extends Hayvon {
  ovoz(): string {
    return `${this.ism} deydi: Vov!`; // ✅ — protected, voris kiradi
  }
}

const it = new It("Baxter");
it.ovoz();  // ✅
it.ism;     // ❌ — protected, tashqaridan kirish yo'q

# — JavaScript private (hard private)

TypeScript private — compile-time tekshiruv, runtime da xususiyat hali ochiq. Haqiqiy private uchun JavaScript ning #:

class Counter {
  #count = 0; // haqiqiy private — runtime da ham yashirin

  increment(): void { this.#count++; }
  value():     number { return this.#count; }
}

const c = new Counter();
c.#count; // ❌ — syntax xato, hatto runtime da ham

Tez-tez uchraydigan xatolar

private konstruktorda:

class Singleton {
  private static instans: Singleton;
  private constructor() {} // ✅ — tashqaridan new qilib bo'lmaydi

  static olish(): Singleton {
    if (!Singleton.instans) Singleton.instans = new Singleton();
    return Singleton.instans;
  }
}

new Singleton(); // ❌ — constructor private
Singleton.olish(); // ✅

Xulosa

public    — har joydan kirish (standart)
private   — faqat class ichidan (compile-time)
protected — class va vorislardan
#field    — haqiqiy private (runtime da ham yashirin)
class Example {
  public    ochiq: string   = "";
  private   yashirin: number = 0;
  protected himoyalangan: boolean = false;
  #haqiqiy: string = "";
}

Keyingi dars

40-dars: readonly xususiyatlar va parameter properties