Classes và Module trong TypeScript

Classes và Module trong TypeScript

Module 4 - Classes và Module trong TypeScript

  • Bài viết này nằm trong khuôn khổ của: Bài 2 - Dựng khung dự án website bán thẻ Pokemon.

Bạn nào chưa đọc thì có thể đọc tại đây.

Việc tổ chức mã nguồn và tận dụng các khái niệm lập trình hướng đối tượng (OOP) là vô cùng quan trọng. Tiếp nối các bài viết trước về TypeScript, hôm nay tôi muốn chia sẻ những kiến thức cốt lõi từ Module 4, phần cuối cùng của chuỗi bài "Dựng khung dự án" – tập trung vào Class và Module. Đây không chỉ là những tính năng cơ bản mà còn là chìa khóa để chúng ta xây dựng các ứng dụng mạnh mẽ, dễ bảo trì.

1. Class trong TypeScript

TypeScript hỗ trợ đầy đủ các tính năng của lập trình hướng đối tượng thông qua class, mang lại cấu trúc và khả năng tái sử dụng cao cho mã nguồn.

  • Thành viên của Class (Class Members):

    • Thuộc tính (Properties): Là các biến lưu trữ dữ liệu của đối tượng. Bạn có thể định nghĩa kiểu cho từng thuộc tính. Nếu không gán giá trị mặc định, TypeScript sẽ tự động gán là any.
    • Khởi tạo giá trị mặc định: Có thể gán giá trị mặc định cho thuộc tính ngay khi khai báo, hoặc trong hàm khởi tạo (constructor). Giá trị này sẽ tự động được áp dụng khi class được khởi tạo.
      • strictPropertyInitialization: Cài đặt này yêu cầu các trường của class phải được khởi tạo giá trị ban đầu. Nếu không khởi tạo, bạn cần thêm dấu ! (non-null assertion operator) sau tên thuộc tính hoặc gán giá trị undefined.
  • Getters và Setters: Cung cấp cơ chế kiểm soát việc truy cập và thay đổi giá trị của thuộc tính, tương tự như các ngôn ngữ lập trình hướng đối tượng khác như Java hay C++.

    • Getter (get): Để đọc giá trị của thuộc tính. Nếu getter tồn tại nhưng không định nghĩa setter, thuộc tính sẽ tự động được đặt là readonly.
    • Setter (set): Để gán giá trị cho thuộc tính.
    • Quy tắc: Nếu kiểu của setter không được định nghĩa, nó sẽ được lấy từ kiểu trả về của getter.
  • Kế thừa Class (Class Heritage) - extends: Cho phép một class kế thừa các thuộc tính và phương thức từ một class khác. Đây là cơ chế mạnh mẽ để tái sử dụng code và xây dựng hệ thống phân cấp đối tượng.

    • Ví dụ: Một class Dog có thể kế thừa từ class Animal, tức là Dog sẽ có tất cả các phương thức và thuộc tính của Animal, đồng thời có thể thêm các hành vi riêng của mình (ví dụ: woof()).
  • Triển khai Interface (Implements): Một class có thể triển khai một hoặc nhiều interface, đảm bảo rằng class đó tuân thủ một bộ quy tắc về cấu trúc và hành vi.

    • Ví dụ: Class Ball có thể implement interface Pingable, đảm bảo rằng nó có phương thức ping().
  • Ghi đè phương thức (Method Overriding): Class con có thể định nghĩa lại phương thức của class cha để thay đổi hành vi của nó.

2. Member Visibility

TypeScript cung cấp ba cấp độ hiển thị cho thành viên của class, kiểm soát khả năng truy cập từ bên ngoài hoặc từ các class con.

  • public (Mặc định): Thành viên public có thể truy cập từ bất cứ đâu.
  • protected: Thành viên protected chỉ có thể truy cập từ class đó và các class con của nó. Không thể truy cập từ bên ngoài class hoặc các class không kế thừa.
  • private: Thành viên private chỉ có thể truy cập được từ bên trong class mà nó được khai báo. Đây là cấp độ hạn chế nhất.

3. Module trong TypeScript

Module là một cách mạnh mẽ để tổ chức mã nguồn, giúp chia nhỏ ứng dụng thành các phần nhỏ hơn, dễ quản lý và tái sử dụng.

  • ES Module (Phổ biến nhất): Đây là chuẩn module hiện đại, được sử dụng rộng rãi trong JavaScript và TypeScript.

Export mặc định (export default): Chỉ cho phép xuất một thành phần duy nhất từ một module.

Import mặc định: Dùng để nhập thành phần được export default.

Export có tên (export): Cho phép xuất nhiều biến, hàm, class từ một module.

Import có tên: Nhập các thành phần được export có tên.

  • Đổi tên khi import: Sử dụng từ khóa as để đổi tên thành phần khi import.

  • Import tất cả (import * as ...): Nhập tất cả các thành phần được export có tên vào một đối tượng.

  • CommonJS (Chủ yếu trong Node.js): Là hệ thống module truyền thống trong Node.js, sử dụng module.exports để xuất và require() để nhập.

    • Export: Gán các thành phần vào module.exports.
    • Import: Sử dụng hàm require().

Lời Kết:

Class và Module là hai khái niệm nền tảng, không thể thiếu khi xây dựng các ứng dụng TypeScript. Class giúp chúng ta tổ chức code theo hướng đối tượng, tạo ra các blueprint cho các đối tượng và cho phép kế thừa, ghi đè. Module giúp chúng ta chia nhỏ ứng dụng, quản lý sự phụ thuộc và tái sử dụng code hiệu quả.

Với những kiến thức về Class và Module, bạn đã sẵn sàng để bắt tay vào xây dựng các dự án TypeScript lớn hơn, có cấu trúc rõ ràng và dễ bảo trì. Đây cũng là Module cuối cùng trong chuỗi bài giới thiệu cơ bản về TypeScript. Ở những video tiếp theo, chúng ta sẽ đi sâu vào tìm hiểu các thư viện phổ biến và cách cấu hình dự án trong môi trường thực tế.

Trong quá trình thực hiện dự án này không may có sai sót, rất mong nhận được sự góp ý từ các bạn để mình có thể hoàn thiện hơn trong tương lai.

Hẹn gặp lại trong những chia sẻ sắp tới. Chúc các bạn học tập và làm việc hiệu quả!