открытые аргументы функции с TypeScript

132

ИМО, одна из основных задач языка 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 #?

tugberk
источник
2
Просто любопытно, почему у вас вообще есть именованный numbersпараметр? Вы ничего не делаете с этим.
Джастин Морган
1
@JustinMorgan, имеющий хотя бы один параметр, позволяет Intellisense хотя бы намекать, что должны быть некоторые аргументы.
drzaus

Ответы:

272

В 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));
chuckj
источник
Большой! Спасибо. Это определенно правильный путь. Итак, если у кого-то есть существующий код, как в моем вопросе, он сломается. Правильно?
tugberk 02
1
Да. Он жалуется на вызов, но вы можете объявить сумму как принимающую несколько параметров любого типа, вместо этого изменив подпись на sum (...), и она заглушит ошибку. Не стесняйтесь сообщать об этом как об ошибке на CodePlex.
chuckj 02
1
Искал пример параметра отдыха. Ty.
AM
6

В дополнение к ответу @chuckj: вы также можете использовать arrow function expressionв TypeScript (это своего рода lambdaв Java / .NET)

function sum(...nums: number[]): number {
    return nums.reduce((a, b) => a + b, 0);
}
Йерун ван Дейк-Джун
источник
4

В Typescript это концепция Rest Parameter , это параметр, который получает несколько значений аналогичного типа. Если мы нацелены на машинописный текст, тогда мы должны написать код стандарта ECMAScript 6 , а затем машинописный транспилятор преобразует его в эквивалентный ему код java-скрипта ( который является стандартом ECMAScript 5 ). Если мы используем машинописный текст, тогда мы должны использовать три точки (...) Preferx с именем переменной restparameter, например, function sum (... numbers: number []), тогда это будет работать.

Примечание. Параметр отдыха должен быть последним параметром в списке параметров. Аналогично функции sum (имя: строка, возраст: число, ... числа: число []).

Шео Дайал Сингх
источник