Kiểu giao cắt trong TypeScript

Kiểu giao cắt trong TypeScript

Bài viết này giải thích về kiểu giao cắt trong TypeScript.

YouTube Video

Kiểu giao cắt trong TypeScript

Trong TypeScript, kiểu giao cắt là cách kết hợp nhiều kiểu để tạo một kiểu mới.

Kiểu giao cắt là gì?

Kiểu giao cắt cho phép bạn kết hợp nhiều kiểu để định nghĩa một kiểu mới với tất cả các thuộc tính của những kiểu đó. Kiểu giao cắt được định nghĩa bằng ký hiệu & và yêu cầu tất cả các thuộc tính từ mỗi kiểu thành phần.

Ví dụ:

1type A = { name: string };
2type B = { age: number };
3
4type C = A & B;
5
6const person: C = {
7    name: "John Doe",
8    age: 30
9};

Trong đoạn mã này, bằng cách định nghĩa type C = A & B, kiểu C trở thành kiểu đối tượng với các thuộc tính name (kiểu chuỗi) và age (kiểu số).

Lợi ích của kiểu giao cắt

Bằng cách sử dụng kiểu giao cắt, bạn có thể tái sử dụng các kiểu hiện có và định nghĩa các kiểu linh hoạt và phức hợp hơn. Điều này nâng cao khả năng bảo trì và mở rộng của mã nguồn của bạn. Ngoài ra, kiểu giao cắt có thể áp dụng các giới hạn của nhiều kiểu khác nhau đồng thời, do đó cải thiện độ an toàn của kiểu.

Lợi ích:

  • Khả năng tái sử dụng: Bằng cách kết hợp nhiều kiểu, bạn có thể giảm các định nghĩa dư thừa và tái sử dụng các kiểu hiện có.
  • Độ an toàn kiểu: Kiểu giao cắt cải thiện việc kiểm tra kiểu bằng cách chỉ cho phép các đối tượng đáp ứng điều kiện của nhiều kiểu.

Các trường hợp sử dụng của kiểu giao cắt

Kiểu giao cắt cực kỳ hữu ích khi mở rộng đối tượng hoặc giao diện. Đặc biệt, nó hữu ích khi bạn muốn biểu diễn đối tượng với nhiều thuộc tính.

Trường hợp sử dụng 1: Đối tượng với nhiều giao diện

 1interface Drivable {
 2    drive(): void;
 3}
 4
 5interface Flyable {
 6    fly(): void;
 7}
 8
 9type Vehicle = Drivable & Flyable;
10
11const car: Vehicle = {
12    drive() {
13        console.log("Driving on the road");
14    },
15    fly() {
16        console.log("Flying in the sky");
17    }
18};
19
20car.drive(); // "Driving on the road"
21car.fly();   // "Flying in the sky"

Trong ví dụ này, kiểu Vehicle được định nghĩa như một kiểu giao cắt kết hợp DrivableFlyable. Một đối tượng thuộc kiểu Vehicle phải triển khai cả hai phương thức drive()fly().

Trường hợp sử dụng 2: Kết hợp các lớp và kiểu giao cắt

Bằng cách kết hợp các lớp và kiểu giao cắt, có thể tạo ra các đối tượng có các thuộc tính của nhiều giao diện.

 1interface Person {
 2    name: string;
 3}
 4
 5interface Employee {
 6    employeeId: number;
 7}
 8
 9type PersonEmployee = Person & Employee;
10
11class CompanyWorker implements PersonEmployee {
12    constructor(public name: string, public employeeId: number) {}
13
14    getDetails() {
15        return `${this.name}, Employee ID: ${this.employeeId}`;
16    }
17}
18
19const worker = new CompanyWorker("Alice", 123);
20console.log(worker.getDetails()); // "Alice, Employee ID: 123"

Ở đây, chúng tôi sử dụng kiểu giao cắt PersonEmployee của PersonEmployee để làm cho lớp CompanyWorker có các thuộc tính của cả hai.

Những điểm cần lưu ý với loại giao nhau

Một điểm quan trọng khi sử dụng loại giao nhau là cần lưu ý đến khả năng xung đột thuộc tính. Nếu các thuộc tính cùng tên có chú thích kiểu khác nhau ở các loại khác nhau, có thể xảy ra lỗi.

Ví dụ cần thận trọng:

1type A = { id: number };
2type B = { id: string };
3
4type C = A & B;
5
6// Error: Type 'number' and 'string' are not compatible
7const obj: C = {
8    id: 1
9};

Trong ví dụ này, các thuộc tính id của AB xung đột, gây ra lỗi khi định nghĩa một đối tượng với loại C. Trong những trường hợp như vậy, cần xem xét thiết kế để tránh xung đột thuộc tính.

Ví dụ mã với chú thích kiểu cho các loại giao nhau

Cuối cùng, đây là một ví dụ mã thực tế bao gồm các chú thích kiểu.

Ví dụ 1: Hiển thị chi tiết đối tượng

 1type ContactInfo = { phone: string; email: string };
 2type Address = { city: string; postalCode: string };
 3
 4type PersonDetails = ContactInfo & Address;
 5
 6const details: PersonDetails = {
 7    phone: "123-4567",
 8    email: "example@mail.com",
 9    city: "New York",
10    postalCode: "10001"
11};
12
13console.log(details);

Ví dụ 2: Đối tượng với các thuộc tính bổ sung

 1interface BasicInfo {
 2    name: string;
 3    age: number;
 4}
 5
 6interface WorkInfo {
 7    company: string;
 8    position: string;
 9}
10
11type FullInfo = BasicInfo & WorkInfo;
12
13const employee: FullInfo = {
14    name: "Bob",
15    age: 28,
16    company: "Tech Corp",
17    position: "Engineer"
18};
19
20console.log(`${employee.name} is a ${employee.position} at ${employee.company}`);

Kết luận

Các loại giao nhau của TypeScript là một tính năng mạnh mẽ để kết hợp nhiều loại thành một loại mới. Điều này tăng cường khả năng tái sử dụng và an toàn của mã, cho phép định nghĩa các loại phức tạp. Bằng cách tận dụng tốt tính linh hoạt của thiết kế và cẩn thận với xung đột kiểu, bạn có thể đạt được mã mạnh mẽ và dễ đọc.

Bạn có thể làm theo bài viết trên bằng cách sử dụng Visual Studio Code trên kênh YouTube của chúng tôi. Vui lòng ghé thăm kênh YouTube.

YouTube Video