Trong TypeScript, cả type và interface đều được sử dụng để định nghĩa các kiểu dữ liệu. Tuy nhiên, chúng có những khác biệt quan trọng về cách sử dụng, khả năng mở rộng, và tính năng. Hiểu rõ sự khác biệt giữa type và interface sẽ giúp bạn chọn lựa công cụ phù hợp cho các nhu cầu khác nhau trong lập trình. Bài viết này sẽ phân tích những điểm khác biệt này một cách chi tiết.
type là một từ khóa trong TypeScript cho phép bạn định nghĩa các kiểu dữ liệu, bao gồm cả kiểu nguyên thủy, kiểu đối tượng, kiểu hàm, và nhiều kiểu khác.
type User = {
name: string;
age: number;
};
interface là một cách khác để định nghĩa kiểu dữ liệu, thường được sử dụng để mô tả cấu trúc của các đối tượng. interface cũng hỗ trợ tính kế thừa và mở rộng.
interface User {
name: string;
age: number;
}
Một trong những điểm khác biệt chính giữa type và interface là khả năng mở rộng.
interface và thêm các thuộc tính mới.interface User {
name: string;
}
interface User {
age: number;
}
// Kết quả là User có cả name và age
const user: User = {
name: 'Alice',
age: 25,
};
type User = {
name: string;
};
// Nếu bạn cố gắng khai báo lại
type User = {
age: number;
}; // Lỗi: Duplicate identifier 'User'.
Cả type và interface đều hỗ trợ tính kế thừa, nhưng cách thức thực hiện khác nhau.
extends để kế thừa từ một hoặc nhiều interface khác.interface Person {
name: string;
}
interface User extends Person {
age: number;
}
&) để kết hợp nhiều kiểu.type Person = {
name: string;
};
type User = Person & {
age: number;
};
Cả hai đều có thể được sử dụng để định nghĩa kiểu hàm, nhưng cú pháp hơi khác nhau.
type Add = (a: number, b: number) => number; const add: Add = (a, b) => a + b;
interface Add {
(a: number, b: number): number;
}
const add: Add = (a, b) => a + b;
type StringOrNumber = string | number;
Cả type và interface đều dựa trên tính tương thích cấu trúc. Điều này có nghĩa là bạn có thể sử dụng một đối tượng có cấu trúc tương tự như một interface hoặc type mà không cần phải định nghĩa chính xác kiểu.
type User = {
name: string;
age: number;
};
const user = {
name: 'Alice',
age: 25,
address: '123 Main St',
};
// user có thể được sử dụng như User
const displayUser = (user: User) => {
console.log(user.name);
};
displayUser(user); // "Alice"
Sự khác biệt giữa type và interface trong TypeScript chủ yếu nằm ở khả năng mở rộng, tính kế thừa, và khả năng định nghĩa kiểu cho các loại dữ liệu khác nhau. interface thường được ưa chuộng hơn khi bạn cần định nghĩa cấu trúc cho các đối tượng, trong khi type cung cấp tính linh hoạt hơn cho các kiểu dữ liệu phức tạp. Hiểu rõ các khác biệt này sẽ giúp bạn chọn lựa công cụ phù hợp cho nhu cầu cụ thể của dự án, từ đó cải thiện chất lượng mã nguồn và khả năng bảo trì.