Trong TypeScript, dấu gạch đứng (|) được gọi là toán tử union (union operator). Nó cho phép bạn kết hợp nhiều kiểu với nhau, tức là giá trị có thể thuộc một trong các kiểu đã chỉ định. Điều này mang lại sự linh hoạt khi bạn muốn một biến, tham số, hoặc giá trị trả về có thể có nhiều kiểu khác nhau.

Cách hoạt động của Toán Tử Union

Cú pháp của union rất đơn giản. Bạn chỉ cần sử dụng dấu gạch đứng giữa các kiểu dữ liệu để tạo một kiểu union.

Ví dụ:

let value: string | number;

Trong ví dụ này, biến value có thể chứa giá trị thuộc kiểu string hoặc number.

Ví dụ chi tiết về Toán Tử Union

1. Union với kiểu nguyên thủy

let id: string | number;

id = "123";  // Hợp lệ, vì id có thể là string
id = 123;    // Hợp lệ, vì id có thể là number

Biến id ở đây có thể nhận cả chuỗi và số, nhờ đó giúp mã linh hoạt hơn khi làm việc với các trường hợp như ID có thể dưới dạng chuỗi (ví dụ như “123”) hoặc số (ví dụ 123).

2. Union với kiểu đối tượng

Bạn cũng có thể sử dụng union với các kiểu đối tượng phức tạp.

interface Dog {
    bark: () => void;
}

interface Cat {
    meow: () => void;
}

let pet: Dog | Cat;

pet = { bark: () => console.log("Woof!") };  // Hợp lệ, pet là Dog
pet = { meow: () => console.log("Meow!") };  // Hợp lệ, pet là Cat

Trong ví dụ này, biến pet có thể là một đối tượng Dog hoặc Cat. TypeScript sẽ kiểm tra kiểu của đối tượng dựa trên các phương thức hoặc thuộc tính cụ thể của chúng.

3. Sử dụng Toán Tử Union trong Hàm

Khi một tham số có thể có nhiều kiểu, bạn có thể sử dụng union trong hàm.

function printId(id: string | number) {
    console.log(`Your ID is: ${id}`);
}

printId(101);      // Hợp lệ
printId("101");    // Hợp lệ

Hàm printId nhận tham số có kiểu union (string | number), vì vậy bạn có thể gọi hàm này với cả giá trị chuỗi và số.

Kiểm tra kiểu trong union

Khi bạn sử dụng kiểu union, TypeScript sẽ không tự động biết được kiểu nào đang được sử dụng. Do đó, bạn cần kiểm tra kiểu trước khi làm việc với giá trị.

Ví dụ:

function printId(id: string | number) {
    if (typeof id === "string") {
        console.log(`ID dưới dạng chuỗi: ${id.toUpperCase()}`);
    } else {
        console.log(`ID dưới dạng số: ${id}`);
    }
}

Trong ví dụ này, chúng ta sử dụng typeof để kiểm tra xem id là chuỗi hay số, từ đó có thể xử lý từng trường hợp một cách chính xác.

Union với nhiều kiểu dữ liệu

Bạn có thể kết hợp nhiều hơn hai kiểu bằng toán tử union.

let data: string | number | boolean;

data = "Hello";   // Hợp lệ
data = 100;       // Hợp lệ
data = true;      // Hợp lệ

Trong trường hợp này, biến data có thể là string, number, hoặc boolean. Điều này cung cấp sự linh hoạt cho việc xử lý dữ liệu có thể ở nhiều dạng.

Kết hợp với nullundefined

Bạn có thể sử dụng union để cho phép một giá trị có thể là null hoặc undefined.

let value: string | null | undefined;

value = "Hello";      // Hợp lệ
value = null;         // Hợp lệ
value = undefined;    // Hợp lệ

Kiểu union này đặc biệt hữu ích khi bạn làm việc với các giá trị có thể không tồn tại hoặc bị bỏ qua, chẳng hạn như các giá trị từ API.

Kết luận

Dấu gạch đứng (|) trong TypeScript là toán tử union, cho phép một giá trị có thể thuộc nhiều kiểu dữ liệu khác nhau. Nó giúp bạn định nghĩa các kiểu linh hoạt và xử lý dữ liệu có thể tồn tại dưới nhiều dạng khác nhau trong chương trình, từ kiểu nguyên thủy đến các đối tượng phức tạp. Sự linh hoạt này giúp bạn viết mã dễ bảo trì và dễ mở rộng hơn trong các dự án lớn.