Как документировать список аргументов с переменной длиной с известными типами параметров?

по теме: правильный способ документирования функций аргументов открытого типа в JSDoc

у меня есть функция, которая принимает несколько массивов при обращении к arguments переменной:

/**
 * @param options An object containing options
 * @param [options.bind] blablabla (optional)
 */
function modify_function (options) {
    for (var i=1; i<arguments.length; i++) {
        // ...
    }
}

теперь, я знаю, что каждый аргумент кроме options массив, содержащий значения, которые стоит документировать:

[search_term, replacement, options]

Я не рассматриваю возможность размещения (длинного) описания в строке параметра переменной.

@param {...} Матрица с поисковыми терминами, заменами и их вариантами; индекс 0: поисковый термин в пределах функции; 1: текст замены; 2: Дополнительные параметры (catch_errors: ловит ошибки и регистрирует их, escape: escape dollars в тексте замены, pos: "L" для размещения замены перед поисковым термином, " R " для размещения его после) Не читаемое решение, и тип не отображается.

есть ли способ документировать типы и значения переменной параметр?

@param {...[]} An array with search terms, replacements and its options
@param {...[0]} The search term within the function
@param {...[1]} The replacement text 
@param {...[2]} An optional object with obtions for the replacement
@param {...[2].catch_errors} catches errors and log it
@param {...[2].escape} etc...

выше выглядит уродливо, но это должно дать вам представление о том, что я пытаюсь добиться:

  • документировать тип параметра переменной (в данном случае массива)
  • документировать значения этого массива
  • документировать свойства объекта внутри этого массива

для лени, я использовал массив вместо объекта. Другие предложения всегда приветствуются.

2 ответов


ваша функция не является действительно переменными аргументами, вы должны просто изменить свою подпись на то, что предложила foundrama. За исключением того, что синтаксис JSDoc немного лучше, чем предложил foundrama

/**
 * @param {String} searchTerm
 * @param {String} replacementText
 * @param {Object} opts (optional) An object containing the replacement options
 * @param {Function} opts.catch_errors Description text
 * @param {Event} opts.catch_errors.e The name of the first parameter 
 *         passed to catch_errors
 * @param {Type} opts.escape Description of options
 */

и вы бы назвали это как

modify_text('search', 'replacement', {
    catch_errors: function(e) {

    },
    escape: 'someEscape'

});

Если у вас действительно есть случай для стиля varargs, это должна быть переменная того же типа, которая может быть передана в конце списка параметров, я документирую ее следующим образом, хотя это не стандарт JSDoc, это то, что Google использует со своей документацией

/**
 * Sums its parameters
 * @param {...number} var_args Numbers to be added together
 * @return number
 */
function sum(/* num, num, ... */) { 
    var sum = 0;
    for (var i =0; i < arguments.length; i++) {
      sum += arguments[i];
    }
    return sum;
}

Если вы не ограничены каким-либо другим API, то первое, что я бы предложил, было бы:Не используйте массив ни для чего, кроме сбора данных, который вы собираетесь перебирать.

вероятно, лучшим подходом здесь было бы перефакторировать функцию так, чтобы она принимала три параметра или какой-то объект param. Например:

/**
 * @param {String} searchTerm
 * @param {String} replacementText
 * @param {Object} replacementOpts (optional) An object containing the replacement
 * options; optional values in the object include:<ul>
   <li>catch_errors {Type} description text...</li>
   <li>escape {Type} description text...</li></ul>
 */

Я настоятельно рекомендуем не использовать массив (опять же: "если вы не ограничены каким-то API снаружи вашего контроля) , поскольку это окажется как хрупким, так и в конечном итоге немного запутанным.