TypeScript файл декларации для функции с переменным числом/типом аргументов
headjs делает некоторые очень сумасшедшие вещи типа JavaScript в своем API. Например, для функции требуется произвольное количество строк (а не строковый массив). Иногда он заканчивает тот же вызов функции, вы можете, например, завершить его с помощью функции.
head.js("scripturl1", "scripturl2",...,callback);
Вы также можете (так же легко) выполнить следующие
head.js({scriptlabel:"scripturl1"},{scriptlabel2:"scripturl2"},...., callback);
Мой вопрос в том, как HECK мы описываем это в файле декларации? Я все уши здесь, так как мой текущий проход кажется совершенно неправильным.
Ответы
Ответ 1
Спецификация языка TS относится к параметрам с переменным числом/расширенным параметром как "Параметры отдыха". Пример интерфейса с сигнатурой функции, которая принимает параметры покоя:
interface IExample {
fn : (...args : any[]) => any;
}
var x : IExample = {
fn: function(...args : any[]) {
for (var i = 0, arg; arg = args[i]; i++) {
console.log(arg);
}
}
}
x.fn(1);
x.fn(1, 2);
x.fn("cat", "dog", "mouse");
К сожалению, существуют некоторые ограничения. "Параметр останова" должен быть последним в сигнатуре функции, поэтому вы не сможете зафиксировать тип параметра обратного вызова, так как после повторного параметра.
Если это не так, вы могли бы сделать что-то вроде этого:
var fn = function(cb: Function, ...args : string[]) {
...
}
Ответ 2
Декларация проста:
function foo () { //...
Параметр аргументов функции объявления функции в Javascript является просто рекомендательным. При вызове функции Javascript позволяет вызывать с меньшим, чем объявленное количество аргументов (аргументы, не переданные по умолчанию на undefined
), или с более чем объявленным количеством аргументов.
Когда вызывается функция, создается объект аргумент. Объект arguments немного похож на массив (хотя он не является надлежащим объектом Array), который содержит все переданные в аргументе.
Так, например, для обработки бесконечных аргументов вы можете просто:
function foo () {
for (var n=0; n<arguments.length; n++) {
alert(arguments[n]);
}
}
Итак, теперь вы можете вызвать foo
как:
foo(1,2,3);
foo(1,2,3,4,5,6,7,8);
Кроме того, это просто вопрос использования typeof, itstanceof и т.д., чтобы определить, какой тип аргумента передается и обрабатывать их соответственно.