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 и т.д., чтобы определить, какой тип аргумента передается и обрабатывать их соответственно.