TypeScript: So sánh type, interface và abstract class

⏱︎

Read time:

2–3 minutes
TypeScript type, interface và abstract class

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 khiCó code runtime?
typeUnion, tuple hoặc đặt tên cho một kiểu kết hợpKhông
interfaceMô tả object/class và muốn dễ mở rộngKhông
abstract classCác class con cần dùng chung state và hành viCó

Nên chọn cái nào?

  • Chọn type cho union như trạng thái test và các kiểu không chỉ là object.
  • Chọn interface cho hợp đồng object/class; đây là lựa chọn dễ đọc trong nhiều codebase.
  • Chọn abstract class khi 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.