Giới thiệu
hocvietcode.com là website chia sẻ và cập nhật tin tức công nghệ, chia sẻ kiến thức, kỹ năng. Chúng tôi rất cảm ơn và mong muốn nhận được nhiều phản hồi để có thể phục vụ quý bạn đọc tốt hơn !
Liên hệ quảng cáo: [email protected]
Class là một cách tổ chức trạng thái và hành vi vốn đã có trong JavaScript. TypeScript bổ sung cách mô tả thuộc tính, kiểm tra khởi tạo và phạm vi truy cập. Không phải ứng dụng nào cũng cần nhiều class, nhưng hiểu chúng giúp bạn đọc mã Angular, thư viện và những dự án dùng lập trình hướng đối tượng.
Mục lục
interface Enrollable {
enroll(student: string): string;
}
Interface nói rằng một đối tượng phù hợp phải có phương thức enroll nhận string và trả string. Nó không tạo cách lưu học viên hay triển khai việc đăng ký. Class sẽ cung cấp phần triển khai đó và tạo ra giá trị tồn tại trong JavaScript khi chương trình chạy.
class Course implements Enrollable {
public readonly id: number;
public title: string;
protected category: string;
private students: string[] = [];
constructor(id: number, title: string, category: string) {
this.id = id;
this.title = title;
this.category = category;
}
enroll(student: string): string {
const name = student.trim();
if (!name) throw new Error("Tên học viên không được rỗng");
this.students.push(name);
return name + " đã đăng ký " + this.title;
}
get studentCount(): number {
return this.students.length;
}
}
Constructor chạy khi gọi new Course(…). Với strict, thuộc tính phải được khởi tạo theo cách trình biên dịch chứng minh được hoặc được khai báo có thể thiếu. Ở đây id, title, category được gán trong constructor; students có giá trị ban đầu là mảng rỗng. Không dùng dấu ! chỉ để bỏ cảnh báo khi chưa biết giá trị sẽ được gán lúc nào.
Public là phạm vi mặc định: mã bên ngoài có thể truy cập. Private giới hạn truy cập theo kiểm tra kiểu trong class khai báo. Protected cho phép class đó và class con truy cập, nhưng không cho mã bên ngoài. Readonly ngăn gán lại thuộc tính qua kiểu đang kiểm tra; trong ví dụ, id được gán khi khởi tạo rồi giữ nguyên.
Getter studentCount công khai số lượng học viên mà không đưa trực tiếp mảng students ra bên ngoài. Gọi course.studentCount, không phải studentCount(). Dù có khai báo kiểu, enroll vẫn kiểm tra chuỗi rỗng vì đây là điều kiện nghiệp vụ tại thời điểm chạy.
class FreeCourse extends Course {
constructor(id: number, title: string) {
super(id, title, "Miễn phí");
}
describe(): string {
return this.title + " - " + this.category;
}
}
const course = new FreeCourse(1, "TypeScript cơ bản");
console.log(course.enroll(" An "));
console.log(course.studentCount); // 1
console.log(course.describe());
export {};
Super gọi constructor của class cha và phải được thực hiện trước khi truy cập this trong constructor của class con. FreeCourse dùng được category vì nó là protected, nhưng không truy cập trực tiếp students vì nó là private. Ghép các đoạn theo thứ tự vào src/main.ts để biên dịch và chạy bằng Node.js.
Implements chỉ kiểm tra class có đáp ứng interface hay không; nó không tự sao chép phương thức, thêm phần triển khai hoặc gán kiểu tham số cho mọi phương thức. Extends kế thừa hành vi từ class cha. Vì vậy phương thức enroll vẫn cần khai báo kiểu rõ ràng và phần thân thực thi của riêng nó.
Từ khóa private của TypeScript chủ yếu được bảo vệ khi kiểm tra kiểu, không nên được xem là cơ chế giữ bí mật trước mọi mã JavaScript. Trường có cú pháp #students của JavaScript có quy tắc riêng về quyền truy cập khi chạy. Dù dùng cách nào, dữ liệu được gửi xuống trình duyệt vẫn không trở thành bí mật chỉ nhờ đóng trong class.
Class phù hợp khi dữ liệu và hành vi gắn với nhau. Với một thao tác chuyển đổi đơn giản, hàm và interface có thể dễ theo dõi hơn. Trước khi tạo hệ thống kế thừa nhiều tầng, hãy xem một object kết hợp các hàm nhỏ đã đáp ứng nhu cầu hay chưa.
Đọc thêm: TypeScript: Classes.
Bài trước: TypeScript cơ bản – Promise, async/await và kiểm tra dữ liệu API
hocvietcode.com là website chia sẻ và cập nhật tin tức công nghệ, chia sẻ kiến thức, kỹ năng. Chúng tôi rất cảm ơn và mong muốn nhận được nhiều phản hồi để có thể phục vụ quý bạn đọc tốt hơn !
Liên hệ quảng cáo: [email protected]