0

TypeScript: Khám phá thế giới kiểu dữ liệu

TypeScript là một siêu tập mạnh mẽ của JavaScript, mang đến khả năng gõ tĩnh và nhiều tính năng nâng cao khác, giúp việc xây dựng các ứng dụng quy mô lớn trở nên dễ dàng hơn. Bài viết này sẽ đi sâu vào các kiểu dữ liệu đa dạng có sẵn trong TypeScript, cung cấp nền tảng để bạn hiểu cách làm việc với chúng.

TypeScript là gì?

Trước khi tìm hiểu về các kiểu dữ liệu, hãy cùng điểm qua TypeScript là gì. TypeScript là một siêu tập của JavaScript được biên dịch, gõ tĩnh, cho phép bạn thêm chú thích kiểu vào mã. Điều này cho phép các công cụ tốt hơn, cải thiện chất lượng mã và cộng tác dễ dàng hơn bằng cách phát hiện lỗi tại thời điểm biên dịch.

Trong khi JavaScript được gõ động, TypeScript bổ sung khả năng chỉ định kiểu cho biến, tham số hàm và giá trị trả về. Các kiểu này giúp ngăn ngừa lỗi và cải thiện trải nghiệm của các lập trình viên.

Các kiểu dữ liệu nguyên thủy trong TypeScript

TypeScript có một số kiểu dữ liệu nguyên thủy tích hợp sẵn, là những kiểu phổ biến nhất được sử dụng cho biến và hằng số. Hãy cùng xem xét từng kiểu:

1. Kiểu Number

Kiểu number đại diện cho cả số nguyên và số dấu phẩy động. Không giống như các ngôn ngữ khác, TypeScript không phân biệt giữa kiểu số nguyên và số thực.

let age: number = 25;
let price: number = 19.99;

Trong TypeScript, kiểu number có thể chứa cả giá trị nguyên và thập phân, và không có kiểu int hoặc float riêng biệt.

2. Kiểu String

Kiểu string được sử dụng để biểu diễn văn bản. Bạn có thể sử dụng dấu nháy đơn, nháy kép hoặc dấu huyền (template literals) để xác định giá trị chuỗi.

let name: string = "John Doe";
let greeting: string = `Hello, ${name}!`;

Nội suy chuỗi cũng có sẵn với dấu huyền, như trong ví dụ trên, cho phép bạn nhúng các biểu thức trong chuỗi.

3. Kiểu Boolean

Kiểu boolean đại diện cho một giá trị logic, true hoặc false.

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

Giá trị boolean thường được sử dụng trong các biểu thức điều kiện và luồng điều khiển.

4. Array

Array Trong TypeScript, mảng được gõ tĩnh, nghĩa là bạn có thể chỉ định kiểu của các phần tử bên trong mảng. Có hai cách để xác định một mảng: Ký hiệu kiểu mảng và ký hiệu kiểu generic.

Ký hiệu kiểu mảng:

let numbers: number[] = [1, 2, 3, 4];

Ký hiệu kiểu chung:

let numbers: Array<number> = [1, 2, 3, 4];

Cả hai ký hiệu này đều tương đương nhau, nhưng kiểu generic thường được sử dụng cho các kiểu phức tạp hơn.

5. Tuple

Tuple là một mảng có số lượng phần tử cố định, mỗi phần tử có thể có kiểu khác nhau. Nó hữu ích khi bạn cần lưu trữ một tập hợp các giá trị với các kiểu khác nhau.

let person: [string, number] = ["Alice", 30];

Trong ví dụ này, person là một tuple trong đó phần tử đầu tiên là string và phần tử thứ hai là number.

6. Enum

Enum cho phép bạn xác định một tập hợp các hằng số được đặt tên. Theo mặc định, các giá trị của enum là số, bắt đầu từ 0, nhưng bạn có thể gán các giá trị tùy chỉnh.

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

let move: Direction = Direction.Up;

7. Kiểu Any

Kiểu any là một cách để từ chối kiểm tra kiểu cho một biến cụ thể. Điều này hữu ích khi bạn không biết kiểu của một biến trước hoặc khi làm việc với nội dung động (ví dụ: dữ liệu JSON).

let data: any = 42;
data = "Now I am a string";
data = [1, 2, 3];

Mặc dù any cung cấp tính linh hoạt, nhưng tốt nhất nên sử dụng nó một cách tiết kiệm, vì nó làm mất đi mục đích của tính an toàn kiểu trong TypeScript.

8. Kiểu Void

Kiểu void được sử dụng để chỉ ra rằng một hàm không trả về bất kỳ giá trị nào. Nó thường được sử dụng trong các hàm thực hiện một hành động nhưng không trả về kết quả.

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

Trong ví dụ này, hàm logMessage ghi lại một thông báo nhưng không trả về bất kỳ giá trị nào.

9. Null và Undefined

nullundefined là các kiểu riêng biệt. null đại diện cho sự vắng mặt của một giá trị, trong khi undefined đại diện cho một biến đã được khai báo nhưng chưa được khởi tạo.

let notAssigned: undefined = undefined;
let absentValue: null = null;

Cả nullundefined cũng là kiểu con của any, vì vậy chúng có thể được gán cho các biến kiểu any.

10. Kiểu Never

Kiểu never đại diện cho một giá trị không bao giờ xảy ra. Điều này hữu ích cho các hàm không bao giờ trả về, chẳng hạn như các hàm ném ra ngoại lệ hoặc đi vào vòng lặp vô hạn.

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

Trong ví dụ này, hàm throwError không bao giờ trả về bất kỳ giá trị nào, đó là lý do tại sao kiểu trả về của nó là never.

Khẳng định kiểu (Type Assertions)

Đôi khi, TypeScript không thể suy ra kiểu chính xác hoặc bạn có thể biết nhiều hơn về kiểu so với TypeScript có thể suy luận. Trong những trường hợp như vậy, bạn có thể sử dụng khẳng định kiểu để cho TypeScript biết kiểu của một biến.

let someValue: any = "Hello, TypeScript!";
let strLength: number = (someValue as string).length;

Ngoài ra, bạn có thể sử dụng cú pháp <> cho các khẳng định kiểu (lưu ý rằng cú pháp này không thể được sử dụng trong các tệp JSX).

let strLength: number = (<string>someValue).length;

Kết luận

TypeScript giới thiệu nhiều kiểu dữ liệu giúp tăng tính linh hoạt, an toàn và khả năng bảo trì của mã. Bằng cách sử dụng các kiểu này một cách hiệu quả, bạn có thể phát hiện các lỗi tiềm ẩn sớm trong quá trình phát triển và đảm bảo rằng mã của bạn hoạt động như mong đợi.

Trong bài viết này, chúng ta đã đề cập các kiểu nguyên thủy cơ bản như number, string và boolean, cũng như các kiểu nâng cao hơn như tuple, enum và any. Việc hiểu rõ các kiểu này là điều cần thiết để viết mã TypeScript sạch và không có lỗi.

Cảm ơn các bạn đã theo dõi!


All rights reserved

Viblo
Hãy đăng ký một tài khoản Viblo để nhận được nhiều bài viết thú vị hơn.
Đăng kí