TypeScript là một ngôn ngữ lập trình mạnh mẽ, hỗ trợ lập trình hướng đối tượng với nhiều tính năng hữu ích. Trong bài viết này, chúng ta sẽ khám phá các modifier: Public, Private, Protected và Readonly, giúp bạn kiểm soát quyền truy cập và tính bất biến của các thuộc tính và phương thức trong lớp.

Public Modifier

Modifier public là giá trị mặc định của các thuộc tính và phương thức trong một lớp. Khi một thuộc tính hoặc phương thức được khai báo là public, nó có thể được truy cập từ bất kỳ đâu, bao gồm cả bên ngoài lớp, các lớp kế thừa và các lớp khác.

Ví dụ về Public Modifier

class Animal {
    public name: string;

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

    public speak() {
        console.log(`${this.name} makes a noise.`);
    }
}

const dog = new Animal("Dog");
dog.speak(); // Kết quả: Dog makes a noise.
console.log(dog.name); // Kết quả: Dog

Trong ví dụ này, thuộc tính name và phương thức speak đều được khai báo là public, cho phép chúng có thể truy cập từ bên ngoài lớp.

Private Modifier

Modifier private được sử dụng để chỉ định rằng một thuộc tính hoặc phương thức chỉ có thể được truy cập bên trong lớp mà nó được khai báo. Điều này có nghĩa là các lớp khác hoặc các đối tượng bên ngoài không thể truy cập hoặc sửa đổi thuộc tính hoặc phương thức đó.

Ví dụ về Private Modifier

class Car {
    private model: string;

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

    private startEngine() {
        console.log(`${this.model} engine started.`);
    }

    public drive() {
        this.startEngine();
        console.log(`${this.model} is driving.`);
    }
}

const myCar = new Car("Toyota");
myCar.drive(); // Kết quả: Toyota engine started. Toyota is driving.
// myCar.startEngine(); // Lỗi: Property 'startEngine' is private and only accessible within class 'Car'.
// console.log(myCar.model); // Lỗi: Property 'model' is private and only accessible within class 'Car'.

Trong ví dụ này, thuộc tính model và phương thức startEngine đều được khai báo là private, do đó chúng không thể truy cập từ bên ngoài lớp Car.

Protected Modifier

Modifier protected cho phép một thuộc tính hoặc phương thức được truy cập từ bên trong lớp mà nó được khai báo và từ các lớp kế thừa, nhưng không thể truy cập từ bên ngoài. Điều này hữu ích khi bạn muốn cho phép các lớp con sử dụng các thuộc tính và phương thức của lớp cha nhưng không muốn chúng bị truy cập từ bên ngoài.

Ví dụ về Protected Modifier

class Employee {
    protected id: number;

    constructor(id: number) {
        this.id = id;
    }
}

class Manager extends Employee {
    constructor(id: number) {
        super(id);
    }

    public displayId() {
        console.log(`Manager ID: ${this.id}`);
    }
}

const manager = new Manager(101);
manager.displayId(); // Kết quả: Manager ID: 101
// console.log(manager.id); // Lỗi: Property 'id' is protected and only accessible within class 'Employee' and its subclasses.

Trong ví dụ này, thuộc tính id được khai báo là protected, cho phép lớp Manager truy cập thuộc tính này nhưng không thể truy cập từ bên ngoài.

Readonly Modifier

Modifier readonly được sử dụng để chỉ định rằng một thuộc tính chỉ có thể được gán giá trị một lần, thường là trong constructor của lớp. Sau khi thuộc tính đã được gán giá trị, nó không thể bị thay đổi.

Ví dụ về Readonly Modifier

class Point {
    public readonly x: number;
    public readonly y: number;

    constructor(x: number, y: number) {
        this.x = x;
        this.y = y;
    }
}

const point = new Point(10, 20);
console.log(`Point coordinates: (${point.x}, ${point.y})`); // Kết quả: Point coordinates: (10, 20)
// point.x = 30; // Lỗi: Cannot assign to 'x' because it is a read-only property.

Trong ví dụ này, thuộc tính xy được khai báo là readonly, nghĩa là chúng chỉ có thể được gán giá trị một lần trong constructor và không thể thay đổi sau đó.

Kết luận

Việc sử dụng các modifier như Public, Private, Protected và Readonly trong TypeScript giúp bạn kiểm soát quyền truy cập và tính bất biến của các thuộc tính và phương thức trong lớp. Những tính năng này không chỉ giúp bảo vệ dữ liệu mà còn cải thiện khả năng bảo trì mã, tạo ra một cấu trúc rõ ràng hơn cho ứng dụng của bạn.