Rest parameters trong TypeScript là một tính năng mạnh mẽ giúp xử lý một số lượng tham số không xác định trong các hàm. Bằng cách sử dụng rest parameters, bạn có thể truyền nhiều tham số hơn số lượng được định nghĩa trong hàm mà không cần phải khai báo từng tham số một. Điều này mang lại sự linh hoạt cao trong việc xây dựng các hàm tổng quát hơn, phù hợp với các tình huống khác nhau.

1. Định Nghĩa Rest Parameters

Rest parameters trong TypeScript cho phép bạn gom nhiều đối số thành một mảng duy nhất. Bạn sử dụng dấu ba chấm (...) trước tên tham số để chỉ định rằng tham số này sẽ chứa tất cả các đối số còn lại mà hàm nhận được.

Cú pháp

function exampleFunction(...args: number[]): void {
    console.log(args);
}

Trong ví dụ trên, args là một mảng chứa tất cả các tham số mà bạn truyền vào hàm exampleFunction.

2. Cách Sử Dụng Rest Parameters

Rest parameters rất hữu ích khi bạn muốn một hàm có thể nhận một số lượng tham số tùy ý. Thay vì định nghĩa một số lượng lớn các tham số, bạn có thể sử dụng rest parameters để gom tất cả các tham số thành một mảng.

Ví dụ Cơ Bản

Dưới đây là một ví dụ về một hàm cộng nhiều số:

function sum(...numbers: number[]): number {
    return numbers.reduce((total, num) => total + num, 0);
}

console.log(sum(1, 2, 3)); // Kết quả: 6
console.log(sum(10, 20, 30, 40)); // Kết quả: 100

Trong ví dụ này, hàm sum có thể nhận bao nhiêu số tùy ý và tính tổng của tất cả chúng.

Sử Dụng Rest Parameters Với Các Tham Số Khác

Bạn có thể sử dụng rest parameters cùng với các tham số khác, miễn là rest parameters được đặt ở cuối danh sách tham số.

Ví dụ:

function greet(greeting: string, ...names: string[]): string {
    return `${greeting}, ${names.join(", ")}!`;
}

console.log(greet("Hello", "Alice", "Bob", "Charlie")); // Kết quả: Hello, Alice, Bob, Charlie!

Ở đây, tham số greeting là tham số đầu tiên, và tất cả các tên được truyền vào sau sẽ được gom thành mảng names và xử lý.

3. Kiểm Tra Kiểu Dữ Liệu Với Rest Parameters

Rest parameters trong TypeScript cho phép bạn khai báo kiểu dữ liệu cho các tham số một cách rõ ràng. Điều này giúp kiểm tra kiểu chặt chẽ và tránh các lỗi trong quá trình phát triển.

Ví dụ:

function multiply(multiplier: number, ...values: number[]): number[] {
    return values.map(value => value * multiplier);
}

console.log(multiply(2, 1, 2, 3)); // Kết quả: [2, 4, 6]

Trong ví dụ này, kiểu dữ liệu của values được chỉ định là number[], do đó tất cả các giá trị truyền vào phải là số. Nếu bạn truyền vào một giá trị không phải số, TypeScript sẽ báo lỗi.

4. Sự Khác Biệt Giữa Rest Parameters và Arguments Object

Mặc dù arguments object trong JavaScript cũng cho phép truy cập đến tất cả các đối số được truyền vào hàm, nhưng nó có một số hạn chế so với rest parameters:

  • arguments không phải là một mảng thực sự: Nó là một đối tượng giống mảng, nhưng không có các phương thức như map, reduce, v.v.
  • arguments không làm việc với hàm mũi tên: Hàm mũi tên không có đối tượng arguments, còn rest parameters thì hoạt động tốt.

Ví dụ với arguments:

function oldStyleSum() {
    let total = 0;
    for (let i = 0; i < arguments.length; i++) {
        total += arguments[i];
    }
    return total;
}

console.log(oldStyleSum(1, 2, 3)); // Kết quả: 6

Trong trường hợp này, bạn phải xử lý arguments một cách thủ công vì nó không có các phương thức của mảng.

5. Kết Luận

Rest parameters trong TypeScript là một công cụ mạnh mẽ để xử lý các hàm có số lượng tham số không cố định. Chúng giúp mã ngắn gọn, dễ đọc hơn và cung cấp tính linh hoạt khi làm việc với nhiều tham số. Thay vì sử dụng arguments, việc sử dụng rest parameters cung cấp khả năng tương thích với các phương thức mảng và hỗ trợ kiểm tra kiểu chặt chẽ.