Các kiểu liên kết và giao nhau của TypeScript

TypeScript cung cấp các tính năng hệ thống kiểu mạnh mẽ giúp bạn viết mã an toàn hơn và dễ dự đoán hơn. Trong số các tính năng này có các kiểu hợp nhất và giao nhau, cung cấp tính linh hoạt trong việc xác định và quản lý các kiểu phức tạp. Bài viết này giới thiệu các khái niệm này và cung cấp các ví dụ để minh họa cách sử dụng của chúng.

Các loại liên minh là gì?

Kiểu hợp nhất cho phép một biến giữ các giá trị có nhiều kiểu khác nhau. Điều này hữu ích khi bạn cần biểu diễn một giá trị có thể là một trong nhiều kiểu. Kiểu hợp nhất được biểu thị bằng ký hiệu | (ống).

Định nghĩa các loại liên minh

Để xác định kiểu hợp nhất, bạn chỉ định nhiều kiểu được phân tách bằng ký hiệu |:

let value: string | number;

value = "Hello, TypeScript"; // Valid
value = 42; // Valid
value = true; // Error: Type 'boolean' is not assignable to type 'string | number'

Trong ví dụ này, biến giá trị có thể là chuỗi hoặc số, nhưng không phải là boolean.

Sử dụng Union Type trong Functions

Kiểu hợp nhất đặc biệt hữu ích trong các hàm mà tham số hoặc kiểu trả về có thể là nhiều kiểu:

function formatValue(value: string | number): string {
  if (typeof value === "string") {
    return value.toUpperCase();
  } else {
    return value.toFixed(2);
  }
}

console.log(formatValue("hello")); // Output: HELLO
console.log(formatValue(123.456)); // Output: 123.46

Hàm formatValue lấy tham số có thể là string hoặc number và định dạng cho phù hợp.

Các loại giao lộ là gì?

Kiểu giao nhau cho phép bạn kết hợp nhiều kiểu thành một. Điều này có nghĩa là giá trị của kiểu giao nhau sẽ thỏa mãn tất cả các kiểu trong giao nhau. Kiểu giao nhau được biểu thị bằng ký hiệu & (dấu và).

Xác định các loại giao lộ

Để xác định loại giao điểm, bạn chỉ định nhiều loại được phân tách bằng ký hiệu &:

interface Person {
  name: string;
}

interface Employee {
  employeeId: number;
}

type EmployeePerson = Person & Employee;

const john: EmployeePerson = {
  name: "John Doe",
  employeeId: 1234
};

console.log(john.name); // Output: John Doe
console.log(john.employeeId); // Output: 1234

Trong ví dụ này, kiểu EmployeePerson kết hợp các giao diện PersonEmployee, tạo ra một kiểu có cả thuộc tính nameemployeeId.

Sử dụng các kiểu giao nhau trong hàm

Các kiểu giao nhau cũng có thể được sử dụng trong các hàm để yêu cầu nhiều thuộc tính kiểu:

function printEmployeeDetails(employee: Person & Employee): void {
  console.log(`Name: ${employee.name}`);
  console.log(`Employee ID: ${employee.employeeId}`);
}

const jane: EmployeePerson = {
  name: "Jane Smith",
  employeeId: 5678
};

printEmployeeDetails(jane);
// Output:
// Name: Jane Smith
// Employee ID: 5678

Hàm printEmployeeDetails yêu cầu đối số đáp ứng cả hai kiểu PersonEmployee.

Kết hợp các loại Union và Intersection

Bạn có thể kết hợp các kiểu hợp và giao để tạo ra các định nghĩa kiểu phức tạp:

type Shape = Circle | Rectangle;

interface Circle {
  kind: "circle";
  radius: number;
}

interface Rectangle {
  kind: "rectangle";
  width: number;
  height: number;
}

function getArea(shape: Shape): number {
  if (shape.kind === "circle") {
    return Math.PI * shape.radius * shape.radius;
  } else {
    return shape.width * shape.height;
  }
}

const myCircle: Circle = { kind: "circle", radius: 10 };
const myRectangle: Rectangle = { kind: "rectangle", width: 20, height: 30 };

console.log(getArea(myCircle)); // Output: 314.159...
console.log(getArea(myRectangle)); // Output: 600

Trong ví dụ này, kiểu Shape là sự kết hợp của CircleRectangle, và hàm getArea xử lý cả hai kiểu tương ứng.

Phần kết luận

Các kiểu hợp nhất và giao điểm trong TypeScript cung cấp những cách mạnh mẽ để quản lý và kết hợp các kiểu, mang lại sự linh hoạt và độ chính xác trong định nghĩa kiểu. Các kiểu hợp nhất cho phép một biến là một trong nhiều kiểu, trong khi các kiểu giao điểm kết hợp nhiều kiểu thành một. Bằng cách sử dụng các tính năng này, bạn có thể tạo các ứng dụng mạnh mẽ hơn và an toàn hơn về kiểu.

Thực hành sử dụng các kiểu hợp và giao để làm quen với khả năng của chúng và cải thiện kỹ năng viết mã TypeScript của bạn.