อาร์กิวเมนต์ของฟังก์ชันปลายเปิดด้วย TypeScript


129

IMO หนึ่งในข้อกังวลหลักของภาษาTypeScriptคือการสนับสนุนรหัสวานิลลา JavaScript ที่มีอยู่ นี่คือความประทับใจที่ฉันได้เห็นในแวบแรก ดูฟังก์ชัน JavaScript ต่อไปนี้ซึ่งใช้ได้อย่างสมบูรณ์แบบ:

หมายเหตุ: ฉันไม่ได้บอกว่าฉันชอบแนวทางนี้ ฉันแค่บอกว่านี่เป็นรหัส JavaScript ที่ถูกต้อง

function sum(numbers) { 

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

    return agregatedNumber;
}

ดังนั้นเราจึงใช้ฟังก์ชันนี้ด้วยอาร์กิวเมนต์จำนวนเท่าใดก็ได้:

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

อย่างไรก็ตามเมื่อฉันลองใช้TypeScript Playgroundมันให้ข้อผิดพลาดเวลาคอมไพล์

ฉันสมมติว่านี่เป็นข้อบกพร่อง สมมติว่าเราไม่มีปัญหาความเข้ากันได้ แล้วมีวิธีใดบ้างในการเขียนฟังก์ชันประเภทนี้ด้วยอาร์กิวเมนต์ปลายเปิด? เช่นparamsคุณสมบัติใน C #?


2
แค่อยากรู้ว่าทำไมคุณถึงมีชื่อnumbersพารามิเตอร์? คุณไม่ได้ทำอะไรกับมัน
Justin Morgan

1
@JustinMorgan มีพารามิเตอร์อย่างน้อยหนึ่งตัวให้ Intellisense อย่างน้อยก็บอกใบ้ว่าควรมีอาร์กิวเมนต์บางอย่าง
drzaus

คำตอบ:


269

วิธี TypeScript ในการดำเนินการนี้คือการวางตัวดำเนินการจุดไข่ปลา ( ...) ไว้หน้าชื่อของอาร์กิวเมนต์ ข้างต้นจะเขียนว่า

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

จากนั้นจะพิมพ์ check ถูกต้องด้วย

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

ที่ดี! ขอบคุณ นี่เป็นวิธีที่จะไปแน่นอน ดังนั้นหากมีคนมีรหัสอยู่แล้วเหมือนในคำถามของฉันรหัสนั้นจะพัง ขวา?
tugberk

1
ใช่. มันบ่นเกี่ยวกับการโทร แต่คุณสามารถประกาศ sum เป็นการยอมรับพารามิเตอร์หลาย ๆ ประเภทได้โดยเปลี่ยนลายเซ็นเป็น sum (... ) แทนซึ่งจะทำให้ข้อผิดพลาดเงียบลง โปรดอย่าลังเลที่จะส่งสิ่งนี้เป็นข้อบกพร่องใน CodePlex
chuckj

1
กำลังมองหาตัวอย่างพารามิเตอร์ที่เหลือ ไท
น.

6

นอกจากคำตอบ @chuckj: คุณยังสามารถใช้arrow function expressionใน TypeScript (เป็นชนิดของlambdaJava / .NET)

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

4

ใน typescript เป็นแนวคิดของRest Parameterซึ่งเป็นพารามิเตอร์ที่รับค่าหลายค่าประเภทที่คล้ายกันหากเรากำหนดเป้าหมาย typescript เราจะต้องเขียนโค้ดECMAScript 6 standard จากนั้น typescript Transpiler จะแปลงเป็นโค้ด java script ที่เทียบเท่า ( ซึ่งเป็นมาตรฐานECMAScript 5 ) หากเราใช้ typescript เราจะต้องใช้จุดสามจุด (... ) ชอบกับชื่อตัวแปร restparameter เช่น function sum (... numbers: number []) ก็จะใช้ได้

หมายเหตุ: Rest Parameter ต้องเป็นพารามิเตอร์สุดท้ายในรายการพารามิเตอร์ในทำนองเดียวกันฟังก์ชัน sum (name: string, age: number, ... numbers: number [])

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.