đối số hàm kết thúc mở với TypeScript


128

IMO, một trong những mối quan tâm chính của ngôn ngữ TypeScript là hỗ trợ mã JavaScript vani hiện có. Đây là ấn tượng mà tôi có ngay từ cái nhìn đầu tiên. Hãy xem hàm JavaScript sau đây hoàn toàn hợp lệ:

Lưu ý: Tôi không nói rằng tôi thích cách tiếp cận này. Tôi chỉ nói rằng đây là một mã JavaScript hợp lệ.

function sum(numbers) { 

    var agregatedNumber = 0; 
    for(var i = 0; i < arguments.length; i++) { 
        agregatedNumber += arguments[i];
    }

    return agregatedNumber;
}

Vì vậy, chúng tôi sử dụng hàm này với bất kỳ số lượng đối số nào:

console.log(sum(1, 5, 10, 15, 20));

Tuy nhiên, khi tôi thử điều này với TypeScript Playground , nó cho lỗi thời gian biên dịch.

Tôi giả định rằng đây là một lỗi. Hãy giả sử rằng chúng tôi không có vấn đề về khả năng tương thích. Sau đó, có cách nào để viết loại hàm này với các đối số kết thúc mở không? Chẳng hạn như paramstính năng trong C #?


2
Chỉ tò mò, tại sao bạn thậm chí có một numberstham số được đặt tên ? Bạn không làm gì với nó.
Justin Morgan,

1
@JustinMorgan có ít nhất một tham số cho phép Intellisense ít nhất gợi ý rằng nên có một số đối số.
drzaus

Câu trả lời:


268

Cách thực hiện của TypeScript là đặt toán tử dấu chấm lửng ( ...) trước tên của đối số. Ở trên sẽ được viết là,

function sum(...numbers: number[]) {
    var aggregateNumber = 0;
    for (var i = 0; i < numbers.length; i++)
        aggregateNumber += numbers[i];
    return aggregateNumber;
}

Điều này sau đó sẽ nhập kiểm tra chính xác với

console.log(sum(1, 5, 10, 15, 20));

Tuyệt quá! cảm ơn. Điều này chắc chắn là con đường để đi. Vì vậy, nếu ai đó có một mã hiện có như trong câu hỏi của tôi, nó sẽ bị hỏng. Đúng?
tugberk

1
Đúng. Nó phàn nàn về cuộc gọi nhưng bạn có thể khai báo sum là chấp nhận nhiều tham số thuộc bất kỳ loại nào bằng cách thay đổi chữ ký thành sum (...) thay vì nó sẽ làm giảm lỗi. Vui lòng gửi nó như một lỗi trên CodePlex.
chuckj

1
Đang tìm kiếm một ví dụ tham số nghỉ. Ty.
Sáng

5

Ngoài câu trả lời @chuckj: Bạn cũng có thể sử dụng một arrow function expressiontrong TypeScript (là một loại lambdatrong Java / .NET)

function sum(...nums: number[]): number {
    return nums.reduce((a, b) => a + b, 0);
}

4

Trong nguyên cảo đó là khái niệm về Nghỉ ngơi Parameter , nó là tham số mà nhận được nhiều giá trị của type.If tương tự chúng tôi nhắm mục tiêu các nguyên cảo thì chúng ta phải viết mã ECMAScript 6 tiêu chuẩn, sau đó nguyên cảo transpiler cải nó để mã script java tương đương ( là tiêu chuẩn ECMAScript 5 ). Nếu chúng ta sử dụng typecript thì chúng ta phải sử dụng ba chấm (...) preferx với tên biến tham số lại, chẳng hạn như hàm sum (... number: number []), thì nó mới hoạt động.

Lưu ý: Tham số Rest phải là tham số cuối cùng trong danh sách tham số. Tương tự như hàm sum (tên: chuỗi, tuổi: số, ... số: số []).

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.