TypeScript là một ngôn ngữ lập trình mở rộng từ JavaScript, giúp tăng cường tính an toàn cho mã nguồn thông qua việc định nghĩa kiểu dữ liệu. Việc hiểu rõ về các kiểu dữ liệu đã được định nghĩa sẵn trong TypeScript không chỉ giúp bạn viết mã dễ đọc hơn mà còn giúp phát hiện lỗi ngay từ giai đoạn phát triển. Bài viết này sẽ trình bày chi tiết về các kiểu dữ liệu trong TypeScript, bao gồm các kiểu nguyên thủy, kiểu phức tạp và các kiểu dữ liệu đặc biệt.

Kiểu dữ liệu nguyên thủy (Primitive Types)

TypeScript cung cấp một số kiểu dữ liệu nguyên thủy cơ bản mà bạn sẽ thường xuyên sử dụng trong quá trình lập trình. Dưới đây là các kiểu dữ liệu nguyên thủy này cùng với ví dụ minh họa.

1. Kiểu number

Kiểu number đại diện cho tất cả các số, bao gồm cả số nguyên và số thực. TypeScript không phân biệt giữa các loại số khác nhau như số nguyên hay số thực; tất cả đều được lưu trữ dưới dạng kiểu number.

let age: number = 30; // số nguyên
let height: number = 5.9; // số thực

2. Kiểu string

Kiểu string đại diện cho chuỗi văn bản, có thể bao gồm chữ cái, số và ký tự đặc biệt. Bạn có thể sử dụng dấu nháy đơn, dấu nháy kép hoặc dấu backtick (template literal) để tạo chuỗi.

let name: string = "Alice"; // sử dụng dấu nháy kép
let greeting: string = 'Hello, world!'; // sử dụng dấu nháy đơn
let message: string = `My name is ${name}.`; // sử dụng template literal

3. Kiểu boolean

Kiểu boolean chỉ có hai giá trị là truefalse, thường được sử dụng trong các câu lệnh điều kiện và logic.

let isActive: boolean = true;
let isLoggedIn: boolean = false;

4. Kiểu null

Kiểu null đại diện cho giá trị không có gì, thường được sử dụng để biểu thị rằng một biến không có giá trị.

let nothing: null = null;

5. Kiểu undefined

Kiểu undefined biểu thị cho giá trị chưa được xác định. Biến có kiểu này thường được gán mặc định khi nó chưa được khởi tạo.

let notAssigned: undefined = undefined;

6. Kiểu symbol

Kiểu symbol là một kiểu dữ liệu đặc biệt, thường được sử dụng để tạo các thuộc tính độc nhất cho đối tượng.

const uniqueId: symbol = Symbol("id");

7. Kiểu bigint

Kiểu bigint cho phép bạn làm việc với các số nguyên lớn hơn những gì kiểu number có thể xử lý.

let bigNumber: bigint = BigInt(1234567890123456789012345678901234567890);

Kiểu dữ liệu phức tạp (Complex Types)

Ngoài các kiểu nguyên thủy, TypeScript còn hỗ trợ nhiều kiểu dữ liệu phức tạp cho phép bạn định nghĩa cấu trúc dữ liệu phức tạp hơn.

1. Kiểu array

Kiểu array cho phép bạn lưu trữ nhiều giá trị của cùng một kiểu dữ liệu. Bạn có thể định nghĩa mảng bằng cách sử dụng cú pháp dấu ngoặc vuông.

let numbers: number[] = [1, 2, 3, 4]; // mảng số
let names: Array<string> = ["Alice", "Bob", "Charlie"]; // mảng chuỗi

2. Kiểu tuple

Kiểu tuple cho phép bạn định nghĩa mảng có độ dài cố định và các kiểu dữ liệu khác nhau cho từng phần tử.

let user: [string, number] = ["Alice", 30]; // mảng có 2 phần tử với kiểu dữ liệu khác nhau

3. Kiểu enum

Kiểu enum cho phép bạn định nghĩa các hằng số có tên, giúp mã dễ đọc hơn.

enum Direction {
    Up = 1,
    Down,
    Left,
    Right
}

4. Kiểu object

Kiểu object được sử dụng để định nghĩa một đối tượng có nhiều thuộc tính. Các thuộc tính có thể có kiểu dữ liệu khác nhau.

let person: { name: string; age: number } = { name: "Alice", age: 30 };

Kiểu dữ liệu đặc biệt

TypeScript cũng cung cấp một số kiểu dữ liệu đặc biệt, cho phép bạn làm việc linh hoạt hơn với các biến và giá trị.

1. Kiểu any

Kiểu any cho phép bạn lưu trữ bất kỳ loại dữ liệu nào mà không cần phải xác định kiểu trước. Điều này rất hữu ích khi bạn không chắc chắn về kiểu dữ liệu sẽ được sử dụng.

let something: any = "Hello"; // có thể gán số, chuỗi, đối tượng, v.v.
something = 100; // vẫn hợp lệ

2. Kiểu unknown

Kiểu unknown giống như kiểu any, nhưng an toàn hơn. Bạn phải kiểm tra kiểu trước khi sử dụng giá trị có kiểu unknown.

let value: unknown = 30;
if (typeof value === "number") {
    console.log(value + 1); // hợp lệ
}

3. Kiểu void

Kiểu void thường được sử dụng cho các hàm không trả về giá trị gì. Điều này giúp làm rõ rằng hàm chỉ thực hiện tác vụ mà không trả về kết quả.

function logMessage(message: string): void {
    console.log(message);
}

4. Kiểu never

Kiểu never đại diện cho các giá trị không bao giờ xảy ra, thường sử dụng trong các hàm ném lỗi hoặc không bao giờ hoàn thành. Điều này giúp đảm bảo rằng mã không thể đạt đến một điểm nào đó.

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

Kết luận

TypeScript cung cấp một loạt các kiểu dữ liệu đã được định nghĩa sẵn, giúp người lập trình có thể dễ dàng quản lý và xác định kiểu cho các biến, hàm và đối tượng. Việc sử dụng đúng kiểu dữ liệu không chỉ làm cho mã nguồn của bạn dễ đọc và bảo trì hơn mà còn giúp phát hiện lỗi từ sớm trong quá trình phát triển. Việc nắm vững các kiểu dữ liệu này sẽ giúp bạn trở thành một lập trình viên TypeScript giỏi hơn và viết mã hiệu quả hơn.