TypeScript không chỉ hỗ trợ các kiểu dữ liệu cơ bản mà còn cung cấp nhiều kiểu đặc biệt giúp lập trình viên xây dựng mã nguồn an toàn và dễ bảo trì hơn. Trong bài viết này, chúng ta sẽ tìm hiểu về các kiểu đặc biệt trong TypeScript, bao gồm Union, Intersection, Literal, Nullable, và Never.

Bài viết này là một phần của chuỗi học lập trình trên "codetuthub.com", cùng với các bài học khác như TypeScript Simple Types, TypeScript Functions, và TypeScript Interfaces.

1. Kiểu hợp nhất (Union Types)

Kiểu hợp nhất cho phép bạn xác định một biến có thể chứa nhiều kiểu dữ liệu khác nhau. Bạn sử dụng dấu | để phân tách các kiểu.

Ví dụ về kiểu hợp nhất

ts
let id: string | number;
id = 123; // Hợp lệ
id = "ABC"; // Hợp lệ

Trong ví dụ này, biến id có thể là một chuỗi hoặc một số.

2. Kiểu giao thoa (Intersection Types)

Kiểu giao thoa cho phép bạn kết hợp nhiều kiểu lại với nhau. Điều này hữu ích khi bạn muốn tạo ra một kiểu mới từ các kiểu có sẵn.

Ví dụ về kiểu giao thoa

ts
interface Person {
    name: string;
}

interface Employee {
    employeeId: number;
}

type Worker = Person & Employee;

const worker: Worker = {
    name: "Alice",
    employeeId: 101
};

Trong ví dụ này, Worker là một kiểu giao thoa kết hợp giữa PersonEmployee, yêu cầu đối tượng phải có cả hai thuộc tính.

3. Kiểu chữ (Literal Types)

Kiểu chữ cho phép bạn định nghĩa các giá trị cụ thể mà một biến có thể nhận. Điều này giúp cải thiện tính an toàn cho mã nguồn của bạn.

Ví dụ về kiểu chữ

ts
type Direction = "up" | "down" | "left" | "right";

function move(direction: Direction) {
    console.log(`Moving ${direction}`);
}

move("up"); // Hợp lệ
move("left"); // Hợp lệ
move("forward"); // Lỗi: Argument of type '"forward"' is not assignable to parameter of type 'Direction'.

Trong ví dụ này, biến direction chỉ có thể nhận các giá trị "up", "down", "left", hoặc "right".

4. Kiểu Null và Undefined

TypeScript cho phép bạn chỉ định rằng một biến có thể là null hoặc undefined bằng cách sử dụng các kiểu này trong khai báo.

Ví dụ về kiểu null và undefined

ts
let value: number | null = null; // Hợp lệ
let notAssigned: string | undefined; // Hợp lệ

notAssigned = "Hello"; // Có thể gán giá trị
notAssigned = undefined; // Hợp lệ

Nếu bạn muốn đảm bảo rằng một biến không bao giờ có giá trị null hoặc undefined, bạn có thể bật tùy chọn strictNullChecks trong tệp tsconfig.json.

5. Kiểu Never

Kiểu never được sử dụng để chỉ ra rằng một hàm không bao giờ trả về. Điều này có thể xảy ra trong các tình huống như ném lỗi hoặc khi một vòng lặp vô hạn xảy ra.

Ví dụ về kiểu never

ts
function throwError(message: string): never {
    throw new Error(message);
}

function infiniteLoop(): never {
    while (true) {}
}

Trong ví dụ này, hàm throwError sẽ ném lỗi và không bao giờ trả về giá trị.

6. Kiểu tùy chọn (Optional Types)

TypeScript cho phép bạn đánh dấu các thuộc tính của đối tượng là tùy chọn bằng cách sử dụng dấu ?. Điều này có nghĩa là thuộc tính đó có thể tồn tại hoặc không.

Ví dụ về kiểu tùy chọn

ts
interface User {
    name: string;
    age?: number; // age là tùy chọn
}

const user1: User = { name: "Alice" }; // Hợp lệ
const user2: User = { name: "Bob", age: 30 }; // Hợp lệ

Trong ví dụ này, thuộc tính age là tùy chọn, do đó bạn có thể tạo đối tượng User mà không cần cung cấp giá trị cho age.

7. Kết luận

TypeScript cung cấp nhiều kiểu đặc biệt giúp bạn viết mã an toàn và dễ bảo trì hơn. Việc sử dụng các kiểu hợp nhất, giao thoa, chữ, null, undefined, never, và tùy chọn giúp bạn tối ưu hóa quy trình phát triển ứng dụng. Để tìm hiểu thêm về TypeScript, hãy tham khảo các bài học liên quan trên "codetuthub.com" như TypeScript Simple Types, TypeScript Functions, và TypeScript Interfaces.