Type và interface trong TypeScript

Tạo bởi Hoàng Vũ, chỉnh sửa cuối lúc 29 tháng 1, 2025

Trong TypeScript, ngoài các kiểu dữ liệu cơ bản (string, number, boolean, v.v.), chúng ta có thể định nghĩa kiểu tùy chỉnh bằng typeinterface. Điều này giúp mã nguồn rõ ràng, dễ bảo trì và mở rộng hơn.

1. type trong TypeScript

type được sử dụng để định nghĩa kiểu dữ liệu tùy chỉnh. Có thể dùng type để:

  • Định nghĩa kiểu đối tượng.
  • Tạo kiểu kết hợp (Union & Intersection).
  • Định nghĩa kiểu cho hàm.

1.1. Định nghĩa kiểu đối tượng

type User = {
  name: string;
  age: number;
  isAdmin: boolean;
};

let user1: User = {
  name: "Alice",
  age: 25,
  isAdmin: false,
};

1.2. Sử dụng type với Union (kiểu kết hợp)

Có thể sử dụng | (Union) để tạo kiểu tùy chỉnh có thể nhận nhiều giá trị khác nhau.

type Status = "pending" | "in-progress" | "completed";

let currentStatus: Status = "pending"; 
// currentStatus = "done"; // ❌ Lỗi: Type '"done"' is not assignable to type 'Status'.

1.3. Sử dụng type với Intersection (gộp kiểu)

Dùng & để kết hợp nhiều kiểu lại với nhau.

type Person = {
  name: string;
  age: number;
};

type Employee = {
  company: string;
  position: string;
};

type Developer = Person & Employee;

let dev: Developer = {
  name: "Bob",
  age: 30,
  company: "Tech Corp",
  position: "Software Engineer",
};

2. interface trong TypeScript

interface cũng được sử dụng để định nghĩa kiểu đối tượng, nhưng có một số đặc điểm khác so với type.

2.1. Định nghĩa kiểu đối tượng

interface User {
  name: string;
  age: number;
  isAdmin: boolean;
}

let user2: User = {
  name: "Charlie",
  age: 28,
  isAdmin: true,
};

2.2. Thêm thuộc tính tùy chọn (?)

Có thể sử dụng ? để khai báo một thuộc tính không bắt buộc.

interface Product {
  name: string;
  price: number;
  description?: string; // Thuộc tính không bắt buộc
}

let item: Product = {
  name: "Laptop",
  price: 1000,
};

2.3. Kế thừa interface (extends)

Một interface có thể kế thừa một hoặc nhiều interface khác.

interface Animal {
  name: string;
}

interface Dog extends Animal {
  breed: string;
}

let pet: Dog = {
  name: "Buddy",
  breed: "Golden Retriever",
};

2.4. Interface cho hàm

Có thể sử dụng interface để định nghĩa kiểu của một hàm.

interface MathOperation {
  (a: number, b: number): number;
}

const add: MathOperation = (x, y) => x + y;
console.log(add(5, 10)); // Output: 15

3. So sánh typeinterface

Đặc điểm type interface
Định nghĩa kiểu đối tượng ✅ Có thể ✅ Có thể
Hỗ trợ Union & Intersection ✅ Có thể dùng ` &&`
Kế thừa ❌ Không có extends (chỉ có Intersection) ✅ Hỗ trợ extends
Có thể dùng cho hàm ✅ Có thể ✅ Có thể
Dễ mở rộng ❌ Không thể mở rộng thêm sau khi khai báo ✅ Có thể mở rộng bằng cách khai báo lại

4. Khi nào nên dùng typeinterface?

Trường hợp Nên dùng
Khi cần định nghĩa kiểu cho một đối tượng đơn giản type hoặc interface
Khi cần kế thừa từ nhiều interface khác nhau interface
Khi cần **Union (` ) hoặc Intersection (&`)**
Khi cần định nghĩa kiểu cho một hàm type hoặc interface

Ví dụ, nếu chỉ cần định nghĩa một đối tượng đơn giản:

interface Person {
  name: string;
  age: number;
}

Nhưng nếu cần kết hợp nhiều kiểu dữ liệu khác nhau:

type Employee = Person & { company: string };

Tổng kết

  • type được dùng để định nghĩa kiểu dữ liệu tùy chỉnh, hỗ trợ Union (|) và Intersection (&).
  • interface chủ yếu dùng để định nghĩa đối tượng, có thể mở rộng (extends).
  • Nếu cần kết hợp nhiều kiểu (Union), nên dùng type.
  • Nếu cần mở rộng và kế thừa, nên dùng interface.
Website Logo

Với hơn 10 năm kinh nghiệm lập trình web và từng làm việc với nhiều framework, ngôn ngữ như PHP, JavaScript, React, jQuery, CSS, HTML, CakePHP, Laravel..., tôi hy vọng những kiến thức được chia sẻ tại đây sẽ hữu ích và thiết thực cho các bạn.

Bình luận

Website Logo

Chào, tôi là Vũ. Đây là blog hướng dẫn lập trình của tôi.

Liên hệ công việc qua email dưới đây.

lhvuctu@gmail.com

Chúng Tôi Trên

Bạn đang muốn học về lập trình website?

Bạn cần nâng cao kiến thức chuyên nghiệp hơn để nâng cao cơ hội nghề nghiệp? Liên hệ