کلاس ها (Classes)
کلاس (Class) یعنی قالب ساخت شیء با خاصیت و متد. تایپ اسکریپت روی کلاس های جاوااسکریپت «نوع» و «سطوح دسترسی» اضافه می کند. بنابراین، کد خواناتر و امن تر می شود.
اعضا: نوع دهی
اعضای کلاس یعنی ویژگی ها و متدها. مثل متغیرها نوع می گیرند.
class Person {
name: string;
}
const person: Person = new Person();
person.name = "Jane";
اعضا: سطوح دسترسی (Visibility)
public همه جا قابل دسترسی است. private فقط داخل همان کلاس. protected در کلاس و کلاس های فرزند.
class Person {
private name: string;
public constructor(name: string) {
this.name = name;
}
public getName(): string {
return this.name;
}
}
const person: Person = new Person("Jane");
console.log(person.getName());
نکته: کلیدواژه this معمولاً به نمونه کلاس اشاره می کند. بیشتر درباره this.
ویژگی های پارامتری (Parameter Properties)
با افزودن سطح دسترسی به پارامتر سازنده، همان جا عضو ساخته می شود.
class Person {
public constructor(private name: string) {
}
public getName(): string {
return this.name;
}
}
const person: Person = new Person("Jane");
console.log(person.getName());
فقط خواندنی (Readonly)
readonly اجازه تغییر عضو بعد از مقداردهی اولیه را نمی دهد.
class Person {
private readonly name: string;
public constructor(name: string) {
this.name = name;
}
public getName(): string {
return this.name;
}
}
const person: Person = new Person("Jane");
console.log(person.getName());
پیاده سازی اینترفیس ها (Implements)
کلاس با implements قول می دهد شکل اینترفیس را رعایت کند.
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;
}
}
ارث بری (Extends)
کلاس با extends از کلاس دیگر ویژگی می گیرد. فقط یک والد مجاز است.
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);
}
}
بازنویسی (Override)
کلاس فرزند می تواند متد والد را جایگزین کند. override اشتباهات را کم می کند.
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;
}
public toString(): string {
return `Rectangle[width=${this.width}, height=${this.height}]`;
}
}
class Square extends Rectangle {
public constructor(width: number) {
super(width, width);
}
public override toString(): string {
return `Square[width=${this.width}]`;
}
}
نکته: با تنظیم noImplicitOverride استفاده از override اجباری می شود.
کلاس های انتزاعی (Abstract)
کلاس انتزاعی پایه مشترک می سازد. مستقیم نمونه سازی نمی شود.
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;
}
}
گام های عملی
- اول شکل شیء را بنویس و نوع بده.
- سپس سطح دسترسی درست را انتخاب کن.
- در نیاز به وراثت،
extendsو سپسoverrideرا بساز.
برای تبدیل نوع به تبدیل نوع برو. برای انواع ترکیبی به انواع اتحادی سر بزن.
جمع بندی سریع
- نوع دهی، خطاها را زودتر نشان می دهد.
privateوprotectedدسترسی را محدود می کنند.implementsتعهد به شکل اینترفیس است.extendsارث بری را ممکن می کند.overrideبازنویسی امن می سازد.