2012-10-02 29 views
75

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

Lưu ý: Tôi không nói rằng tôi thích phương pháp này. Tôi chỉ đang nói đây là 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 ta tiêu thụ chức năng này với bất kỳ số lượng đối số:

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

Tuy nhiên, khi tôi cố gắng này ra với TypeScript Playground, nó mang lại cho biên dịch lỗi thời gian.

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

+0

Chỉ cần tò mò, tại sao bạn thậm chí có một tham số 'số' được đặt tên? Bạn không làm bất cứ điều gì với nó. –

+0

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

Trả lời

183

Cách TypeScript để thực hiện việc này 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 như sau,

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

này sau đó sẽ gõ kiểm tra một cách chính xác với

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

Tuyệt vời! 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ẽ phá vỡ. Đúng? – tugberk

+1

Có. Nó phàn nàn về cuộc gọi nhưng bạn có thể khai báo tổng là chấp nhận nhiều tham số của bất kỳ loại nào bằng cách thay đổi chữ ký thành tổng (...) thay vì nó sẽ làm cho lỗi này bị lỗi. Xin vui lòng gửi này như là một lỗi trên CodePlex. – chuckj

+1

Đã tìm kiếm một ví dụ tham số còn lại. Ty. –

2

Ngoài @chuckj câu trả lời: Bạn cũng có thể sử dụng một biểu thức lambda trong nguyên cảo

function sum(...nums: number[]): number { 
    return nums.reduce((a, b) => a + b, 0); 
} 
Các vấn đề liên quan