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

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

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

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

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

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

 AJP14 апр. 2017 г., 12:12
Я разместилЗапрос функции TypeScript для этого, поскольку это (умеренно полезный) образец, который я видел в другом месте.

Ответы на вопрос(2)

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

function foo () { //...

Часть аргументов функции в объявлении функции в Javascript является лишь рекомендательной. При вызове функции Javascript позволяет вам вызывать с меньшим, чем объявленное количество аргументов (аргументы не передаются по умолчаниюundefined) или с более чем заявленным количеством аргументов.

Когда функция вызывается,аргументы объекта создано. Объект arguments немного похож на массив (хотя он не является надлежащим объектом Array), который содержит каждый передаваемый аргумент.

Так, например, для обработки бесконечных аргументов вы можете просто сделать:

function foo () {
  for (var n=0; n
 Josh Handel16 окт. 2012 г., 06:15
Я понимаю javascript, стоящий за этим, но реальный вопрос был специфичным для TypeScript ... Но спасибо за пост :-)
Решение Вопроса

Спецификация языка 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[]) {
    ...
}
 Josh Handel16 окт. 2012 г., 06:16
Я после того, как пообщался с ним некоторое время, я пришел к тому же выводу, что и вы ... жаль, что я не мог бы сделать ... string: string [], callback: () =>пусто но увы не повезло :-( ..) Спасибо за пост.
 AJP14 апр. 2017 г., 12:16
@ClayFerguson шаблон ... rest используется, когда у вас есть значения от 1 до n (возможно, даже от 0 до n?) Для передачи в функцию вместе с другими параметрами, такими как обратный вызов. Например:drop (arg1, arg2, ..., argn, callback))
 user208022528 янв. 2017 г., 06:13
Там'На самом деле это более чистое и лучшее решение, которое технически является не ответом на этот актуальный вопрос (так что, если нужно, уменьшите голос), а скорее рекомендацией: просто поместите свои параметры в объект. как это .... myFunc ("param1 ","param2", {"varParam1": 4 "varParam2": 3}); Это на самом деле БОЛЬШЕ читаемый код, и если вы хотите объявить интерфейс для объекта параметров, который работает с вышеуказанным кодом. Таким образом, все, что нужно сказать, javascript уже настолько хорош в том, как он обрабатывает объекты REST, что вы неt даже не нужны переменные аргументные функции на языке, ни TypeScrip
 user208022515 апр. 2017 г., 16:59
@AJP Я хотел подчеркнуть, что функции, которые принимают много аргументов, иногда легче читать, когда вы просто передаете пары ключ / значение в форме объекта, потому что вы ненадо запомнитьзаказ» параметров, как вы читаете код. Мы'Все мы видели такие методы: doSomething (true, false, false true, true, 0, 10), before и это граничит с анти-паттерном, imp. Конечно, как только вы используете шаблон ключ / значение, это 'Возможно ошибочное написание ключевого имени, но это можно решить с помощью константы или чего-то еще. Или в TypeScript, даже "тип" для набора параметров.

Ваш ответ на вопрос