Хандалтын түвшин (public, private, protected)
TypeScript классын property ба method-д хандалтын түвшин тавьж, гаднаас буруу ашиглахаас хамгаалах боломжтой. Энэ нь объект хандалтат програмчлалын (OOP) нэг үндэс суурь зарчим — encapsulation юм.
Гурван хандалтын түвшин
TypeScript-д гурван хандалтын түвшин байдаг:
class Жишээ {
public нийтийн: string = "хүн бүр хандаж болно";
private нууц: string = "зөвхөн энэ класс л хандана";
protected хамгаалагдсан: string = "энэ класс ба хүүхэд класс хандана";
}
| Түвшин | Тухайн класс | Хүүхэд класс | Гадна |
| ----------- | ------------ | ------------ | ----- |
| public | ✅ | ✅ | ✅ |
| protected | ✅ | ✅ | ❌ |
| private | ✅ | ❌ | ❌ |
Зарим хэл зааж өгөхгүй бол private болдог. TypeScript-д заагаагүй бол public болдог тул тодорхой заах нь зөв дадал.
public — нийтийн хандалт
public property болон method-д хаанаас ч хандаж болно. Анхны утга нь public:
class Машин {
public марк: string;
public загвар: string;
constructor(марк: string, загвар: string) {
this.марк = марк;
this.загвар = загвар;
}
public мэдээлэл(): string {
return `${this.марк} ${this.загвар}`;
}
}
const машин = new Машин("Toyota", "Prius");
console.log(машин.марк); // "Toyota" — гаднаас хандаж болно
console.log(машин.мэдээлэл()); // "Toyota Prius"
private — хувийн хандалт
private нь зөвхөн тухайн классын дотроос л хандаж болно. Дотоод хэрэгжилтийг нуухад хэрэглэнэ:
class Дансны_карт {
public эзэн: string;
private үлдэгдэл: number;
private пин_код: string;
constructor(эзэн: string, анхны_үлдэгдэл: number, пин: string) {
this.эзэн = эзэн;
this.үлдэгдэл = анхны_үлдэгдэл;
this.пин_код = пин;
}
public мөнгө_авах(дүн: number, пин: string): boolean {
if (пин !== this.пин_код) {
console.log("Пин код буруу!");
return false;
}
if (дүн > this.үлдэгдэл) {
console.log("Үлдэгдэл хүрэлцэхгүй!");
return false;
}
this.үлдэгдэл -= дүн;
return true;
}
public үлдэгдэл_харах(пин: string): number | null {
if (пин !== this.пин_код) return null;
return this.үлдэгдэл;
}
}
const карт = new Дансны_карт("Болд", 500_000, "1234");
карт.мөнгө_авах(100_000, "1234"); // true
// карт.үлдэгдэл; // Алдаа: Property 'үлдэгдэл' is private
// карт.пин_код; // Алдаа: Property 'пин_код' is private
private нь өгөгдлийг хамгаалж, зөвхөн зөвшөөрөгдсөн method-оор л хандах боломж олгодог.
protected — хамгаалагдсан хандалт
protected нь private-тай адил боловч хүүхэд класс мөн хандаж болно:
class Ажилтан {
public нэр: string;
protected цалин: number; // хүүхэд класс хандаж болно
private нэвтрэх_нэр: string; // зөвхөн энэ класс
constructor(нэр: string, цалин: number, нэвтрэх_нэр: string) {
this.нэр = нэр;
this.цалин = цалин;
this.нэвтрэх_нэр = нэвтрэх_нэр;
}
}
class Менежер extends Ажилтан {
private хэлтэс: string;
constructor(нэр: string, цалин: number, нэвтрэх_нэр: string, хэлтэс: string) {
super(нэр, цалин, нэвтрэх_нэр);
this.хэлтэс = хэлтэс;
}
урамшуулал_тооцоо(): number {
return this.цалин * 0.1; // protected тул хандаж болно ✅
// return this.нэвтрэх_нэр; // Алдаа: private тул хандаж болохгүй ❌
}
}
const менежер = new Менежер("Дорж", 3_000_000, "dorj123", "Технологи");
console.log(менежер.нэр); // "Дорж" — public ✅
// менежер.цалин; // Алдаа — protected, гаднаас хандаж болохгүй ❌
console.log(менежер.урамшуулал_тооцоо()); // 300_000
readonly — зөвхөн уншигдах
Хандалтын түвшнээс гадна readonly гэсэн өөрчилж болохгүй property байдаг:
class Бүтээгдэхүүн {
readonly id: string;
public нэр: string;
constructor(id: string, нэр: string) {
this.id = id;
this.нэр = нэр;
}
нэр_өөрчлөх(шинэ_нэр: string): void {
this.нэр = шинэ_нэр; // OK — public
// this.id = "123"; // Алдаа: readonly property өөрчлөгдөхгүй
}
}
const бүтээгдэхүүн = new Бүтээгдэхүүн("prod-001", "Гар утас");
бүтээгдэхүүн.нэр = "Зөөврийн компьютер"; // OK
// бүтээгдэхүүн.id = "prod-002"; // Алдаа!
Хандалтын түвшнийг зөв ашиглах нь кодыг найдвартай, аюулгүй болгодог. Гаднаас ямар property өөрчлөгдөж болохыг тодорхой зааж өгснөөр алдааг эртнээс сэргийлдэг.
Дараагийн хичээлд:
Generic — дахин ашиглагдах, олон төрлийн өгөгдлийг зохицуулж чадах кодыг хэрхэн бичихийг сурна.