javascript - ארגומנטים של פונקציות פתוחות ב-TypeScript


לדעתי, אחד מהדאגות העיקריות של שפת 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#?

תשובה #1

הדרך של TypeScript לעשות זאת היא למקם את אופרטור האליפסיס (...) לפני שם הארגומנט. האמור לעיל ייכתב כך,

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

זה אז ייבדק טיפ כהלכה עם

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

תשובה #2

בנוסף לתשובה של @chuckj: אתה גם יכול להשתמש בביטוי פונקציית חץ ב-TypeScript (זה קצת כמו לאמברדה ב-Java/.NET)

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