TypeScript classlar


TypeScript JavaScript sinflariga turlar va ko‘rinish o‘zgartirish moslamalarini qo‘shadi.

JavaScript sinflari haqida ko‘proq bilib oling shu yerda.


ULASHISH

A’zolar: turlari

Class a’zolari (xususiyatlar va usullar) o‘zgaruvchilarga o‘xshash turdagi izohlar yordamida yoziladi.

Misol

class Person {
  name: string;
}

const person = new Person();
person.name = "Jane";
O‘zingiz sinab ko‘ring »


A’zolar: Ko‘rinish

Class a’zolariga ko‘rinishga ta’sir qiluvchi maxsus modifikatorlar ham berilishi mumkin.

TypeScript-da uchta asosiy ko‘rinish modifikatorlari mavjud.

  • public - (standart) klass a’zosiga istalgan joydan murojaat qilishga ruxsat beradi
  • private - class a’zosiga faqat class ichidan kirishga ruxsat beradi
  • protected - class a’zosiga o‘zidan va uni meros qilib olgan har qanday sinflardan kirishga ruxsat beradi, bu quyidagi meros bo‘limida ko‘rib chiqilgan

Misol

class Person {
  private name: string;

  public constructor(name: string) {
    this.name = name;
  }

  public getName(): string {
    return this.name;
  }
}

const person = new Person("Jane");
console.log(person.getName()); // no error
console.log(person.name); // Error: Property 'name' is private and only accessible within class 'Person'.
O‘zingiz sinab ko‘ring »
Sinfdagi this kalit so‘zi odatda class misoliga ishora qiladi. this here haqida ko‘proq o‘qing.

Parametr xususiyatlari

TypeScript parametrga ko‘rinish o‘zgartiruvchisini qo‘shish orqali konstruktorda class a’zolarini aniqlashning qulay usulini taqdim etadi.

Misol

class Person {
  // name is a private member variable
  public constructor(private name: string) {}

  public getName(): string {
    return this.name;
  }
}

const person = new Person("Jane");
console.log(person.getName());
O‘zingiz sinab ko‘ring »

Faqat o‘qish

Massivlarga o‘xshab, readonly kalit so‘zi class a’zolarini o‘zgartirishni oldini oladi.

Misol

class Person {
  private readonly name: string;

  public constructor(name: string) {
    // name cannot be changed after this initial definition, which has to be either at its declaration or in the constructor.
    this.name = name;
  }

  public getName(): string {
    return this.name;
  }
}

const person = new Person("Jane");
console.log(person.getName());
O‘zingiz sinab ko‘ring »

Meros: amalga oshiradi

Interfeyslar (bu yerda ko‘rib chiqilgan) implements kalit so‘zi orqali klass amal qilishi kerak bo‘lgan tipni aniqlash uchun ishlatilishi mumkin.

Misol

interface Shape {
  getArea: () => number;
}

class Rectangle implements Shape {
  public constructor(protected readonly width: number, protected readonly height: number) {}

  public getArea(): number {
    return this.width * this.height;
  }
}
O‘zingiz sinab ko‘ring »
Class har birini implements dan keyin vergul bilan ajratib ko‘rsatish orqali bir nechta interfeyslarni amalga oshirishi mumkin: class Rectangle implements Shape, Colored {

Meros: uzaytiriladi

Sinflar bir-birini extends kalit so‘zi orqali kengaytirishi mumkin.

Class faqat bitta sinfni kengaytirishi mumkin.

Misol

interface Shape {
  getArea: () => number;
}

class Rectangle implements Shape {
  public constructor(protected readonly width: number, protected readonly height: number) {}

  public getArea(): number {
    return this.width * this.height;
  }
}

class Square extends Rectangle {
  public constructor(width: number) {
    super(width, width);
  }

  // getArea gets inherited from Rectangle
}
O‘zingiz sinab ko‘ring »

Bekor qilish

Agar class boshqa sinfni kengaytirsa, u ota-class a’zolarini bir xil nom bilan almashtirishi mumkin.

TypeScript-ning yangi versiyalari buni override kalit so‘zi bilan aniq belgilash imkonini beradi.

Misol

interface Shape {
  getArea: () => number;
}

class Rectangle implements Shape {
  // using protected for these members allows access from classes that extend from this class, such as Square
  public constructor(protected readonly width: number, protected readonly height: number) {}

  public getArea(): number {
    return this.width * this.height;
  }

  public toString(): string {
    return `Rectangle[width=${this.width}, height=${this.height}]`;
  }
}

class Square extends Rectangle {
  public constructor(width: number) {
    super(width, width);
  }

  // this toString replaces the toString from Rectangle
  public override toString(): string {
    return `Square[width=${this.width}]`;
  }
}
O‘zingiz sinab ko‘ring »

Sukut bo‘yicha override kalit so‘zi usulni bekor qilishda ixtiyoriy bo‘lib, faqat mavjud bo‘lmagan usulni tasodifan bekor qilishning oldini olishga yordam beradi.

Uni bekor qilishda foydalanishga majbur qilish uchun noImplicitOverride sozlamasidan foydalaning.


Abstrakt classlar

Sinflar barcha a’zolarni amalga oshirmasdan boshqa classlar uchun asosiy class sifatida foydalanish imkonini beradigan tarzda yozilishi mumkin.

Bu abstract kalit so‘zi yordamida amalga oshiriladi.

Amalga oshirilmagan a’zolar ham abstract kalit so‘zidan foydalanadilar.

Misol

abstract class Polygon {
  public abstract getArea(): number;

  public toString(): string {
    return `Polygon[area=${this.getArea()}]`;
  }
}

class Rectangle extends Polygon {
  public constructor(protected readonly width: number, protected readonly height: number) {
    super();
  }

  public getArea(): number {
    return this.width * this.height;
  }
}
O‘zingiz sinab ko‘ring »
Abstrakt sinflarni to‘g‘ridan-to‘g‘ri yaratish mumkin emas, chunki ularning barcha a’zolari amalga oshirilmaydi.



W3Schools Pathfinder

Yutuqlaringizni kuzating – bu bepul!