аргументи відкритого типу з TypeScript


128

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параметр? Ти з цим нічого не робиш.
Джастін Морган

1
@JustinMorgan, що має принаймні один параметр, дозволяє Intellisense хоча б натякати, що повинні бути деякі аргументи.
drzaus

Відповіді:


268

Спосіб TypeScript для цього полягає в тому, щоб розташувати оператор ellipsis ( ...) перед назвою аргументу. Сказане було б записано як:

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));

Чудово! Дякую. Це, безумовно, шлях. Отже, якщо у когось є існуючий код, як у моєму питанні, він порушиться. Правильно?
тугберк

1
Так. Він скаржиться на виклик, але ви можете оголосити суму прийняттям декількох параметрів будь-якого типу, змінивши підпис на суму (...), замість цього вона усуне помилку. Будь ласка, надішліть це як помилку на CodePlex.
chuckj

1
Шукав приклад параметра відпочинку. Тай.
AM

5

На додаток до відповіді @chuckj: Ви також можете використовувати arrow function expressionTypeScript (це на зразок lambdaJava / .NET)

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

4

У Typescript це поняття параметра відпочинку , це параметр, який отримує кілька значень аналогічного типу. Якщо ми орієнтуємося на машинопис, ми повинні написати код ECMAScript 6 стандартний, тоді транспілятор typecript перетворює його в його еквівалентний код сценарію Java ( що є стандартом ECMAScript 5 ). Якщо ми будемо використовувати typecript, тоді нам доведеться використовувати три крапки (...) предпочитаюx з назвою змінної restparameter, таким як сума функції (... цифри: число []), тоді вона буде працювати.

Примітка: Параметр відпочинку повинен бути останнім параметром у списку параметрів. Так само сума функцій (ім'я: рядок, вік: число, ... числа: число []).

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.