Classes

TypeScript-dagi Classes

TypeScript Sinflar (Classes)

TypeScript JavaScript sinflariga turlar va ko'rinish modifikatorlarini qo'shadi.

JavaScript sinflari haqida ko'proq ma'lumot oling bu yerda.

A'zolar: Turlar

Sinflarning a'zolari (xususiyatlar va metodlar) o'zgaruvchilar kabi tur annotatsiyalari bilan turlangan.

Misol:

class Person {
  name: string;
}
 
const person = new Person();
person.name = 'Jane';

A'zolar: Ko'rinish

Sinf a'zolariga ko'rinish modifikatorlari berilishi mumkin, bu esa ko'rinishni ta'sir qiladi.

TypeScript'da uchta asosiy ko'rinish modifikatori mavjud:

  • public - (standart) sinf a'zosiga har joydan kirishga ruxsat beradi
  • private - faqat sinf ichidan kirishga ruxsat beradi
  • protected - sinf o'zidan va uni meros qilib olgan har qanday sinflardan kirishga ruxsat beradi, bu meros olish bo'limida ko'rib chiqiladi

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()); // person.name sinfdan tashqarida mavjud emas, chunki u private

Sinfdagi this kalit so'zi odatda sinf instansiyasiga ishora qiladi. this haqida ko'proq ma'lumot oling bu yerda.

Parametr Xususiyatlari

TypeScript konstruktor ichida sinf a'zolarini aniqlashning qulay usulini taqdim etadi, parametrga ko'rinish modifikatorlarini qo'shish orqali.

Misol:

class Person {
  // name private a'zo o'zgaruvchisi
  public constructor(private name: string) {}
 
  public getName(): string {
    return this.name;
  }
}
 
const person = new Person('Jane');
console.log(person.getName());

Readonly

Massivlar kabi, readonly kalit so'zi sinf a'zolarini o'zgartirilmasligini ta'minlash uchun ishlatilishi mumkin.

Misol:

class Person {
  private readonly name: string;
 
  public constructor(name: string) {
    // name bu dastlabki aniqlanishdan keyin o'zgartirilmaydi, bu aniqlanish yoki konstruktor ichida bo'lishi kerak.
    this.name = name;
  }
 
  public getName(): string {
    return this.name;
  }
}
 
const person = new Person('Jane');
console.log(person.getName());

Meros: Implements

Interfeyslar (bu yerda ko'rib chiqilgan) sinfni qanday turda bo'lishini implements kalit so'zi orqali 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;
  }
}

Sinf bir nechta interfeyslarni implements orqali ro'yxatga olish orqali amalga oshirishi mumkin, har bir interfeys , bilan ajratiladi: class Rectangle implements Shape, Colored.

Meros: Extends

Sinflar extends kalit so'zi orqali bir-birini kengaytirishi mumkin. Sinf faqat bitta boshqa 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 Rectangle'dan meros qilib olingan
}

O'zgartirish

Sinf boshqa sinfni kengaytirganda, u ota sinfning bir xil nomli a'zolarini almashtirishi mumkin.

Yangi versiyalarda TypeScript override kalit so'zi bilan buni aniq belgilashga ruxsat beradi.

Misol:

interface Shape {
  getArea: () => number;
}
 
class Rectangle implements Shape {
  // bu a'zolarni protected qilib belgilash, ular Rectangle'dan meros olgan sinflardan kirishga ruxsat beradi, masalan, 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);
  }
 
  // bu toString Rectangle'dan meros olingan toString'ni almashtiradi
  public override toString(): string {
    return `Square[width=${this.width}]`;
  }
}

Standart bo'lib, override kalit so'zi metodni almashtirganda ixtiyoriy hisoblanadi va mavjud bo'lmagan metodni tasodifan almashtirishdan saqlanishga yordam beradi. noImplicitOverride sozlamasini ishlatib, bu kalit so'zni almashtirishda majburiy qilish mumkin.

Abstrakt Sinflar

Sinflar, boshqa sinflar uchun asosiy sinf sifatida ishlatilishi mumkin bo'lgan tarzda yozilishi mumkin, hamma a'zolarni amalga oshirish zarur emas. Bu abstract kalit so'zi yordamida amalga oshiriladi. Amalga oshirilmagan a'zolar ham abstract kalit so'zidan foydalanadi.

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;
  }
}

Abstrakt sinflar bevosita yaratilishi mumkin emas, chunki ular barcha a'zolarni amalga oshirmagan.

Ushbu sahifada

GitHubda tahrirlash