Файл объявления TypeScript для функции с переменным числом / типом аргументов

headjs делает некоторые очень сумасшедшие вещи типа JavaScript в своем API. Например, для функции требуется произвольное количество строк (не массив строк). Иногда это завершает тот же самый вызов функции, вы можете, например, завершить его функцией.

head.js("scripturl1", "scripturl2",...,callback);

Вы также можете (так же легко) сделать следующее

head.js({scriptlabel:"scripturl1"},{scriptlabel2:"scripturl2"},...., callback);

Мой вопрос, как HECK мы описываем это в файле декларации? Я все здесь, потому что мой нынешний пас кажется совершенно неверным.

3 ответа

Решение

Спецификация языка 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[]) {
    ...
}

Вы можете сделать что-то вроде:

      type Action<T extends any[]> = (...args: T) => void

Декларация просто:

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 и т. Д. Для определения типа передаваемого аргумента и соответствующей его обработки.

Другие вопросы по тегам