type, interface và abstract class đều có thể mô tả cấu trúc, nhưng chúng phục vụ các nhu cầu khác nhau. Hai công cụ đầu chủ yếu giúp kiểm tra kiểu; abstract class còn chứa code thực sự chạy.
type và interface: hai cách mô tả object
type TestCaseByType = {
title: string;
passed: boolean;
};
interface TestCaseByInterface {
title: string;
passed: boolean;
}Với một object đơn giản, hai cách trên gần như tương đương. Chúng không tạo object và thường bị loại bỏ khi TypeScript biên dịch sang JavaScript.
Điểm mạnh riêng của type
type đặt tên được cho union, tuple, primitive và nhiều kiểu kết hợp khác.
type TestStatus = "passed" | "failed" | "skipped";
type Coordinate = [number, number];
const status: TestStatus = "passed";
const position: Coordinate = [10, 20];Điểm mạnh riêng của interface
interface tự nhiên khi mô tả hình dạng object hoặc hợp đồng cho class. Interface cùng tên còn có thể được gộp khai báo.
interface User {
name: string;
}
interface User {
email: string;
}
const user: User = {
name: "An",
email: "an@example.com",
};abstract class là gì?
Abstract class là lớp nền không được khởi tạo trực tiếp. Nó có thể chứa constructor, dữ liệu, method đã viết sẵn và abstract method mà class con bắt buộc phải hoàn thiện.
abstract class Reporter {
constructor(protected projectName: string) {}
printProject(): void {
console.log("Project: " + this.projectName);
}
abstract export(): string; //hàm này chưa cần viết nội dung
}Sau đó ở class con, có thể định nghĩa sau:
class HtmlReporter extends Reporter {
export(): string { //bây giờ mới định nghĩa hàm export()
return "<h1>Test report</h1>";
}
}const reporter = new HtmlReporter("Website bán hàng");
reporter.printProject();
console.log(reporter.export());
// new Reporter("Demo"); // Lỗi: không thể tạo đối tượng trực tiếp từ abstract class| Công cụ | Phù hợp khi | Có code runtime? |
|---|---|---|
type | Union, tuple hoặc đặt tên cho một kiểu kết hợp | Không |
interface | Mô tả object/class và muốn dễ mở rộng | Không |
abstract class | Các class con cần dùng chung state và hành vi | Có |
Nên chọn cái nào?
- Chọn
typecho union như trạng thái test và các kiểu không chỉ là object. - Chọn
interfacecho hợp đồng object/class; đây là lựa chọn dễ đọc trong nhiều codebase. - Chọn
abstract classkhi thật sự có logic hoặc state chung cần kế thừa. - Không cần đổi qua lại chỉ vì sở thích; hãy theo convention của project.




