Как описать параметры передаваемой анонимной функции?

Я хочу описать curVal с JSDoc?

Я старался @param как раз перед arrays.every() и внутри анонимного обратного вызова, но это не помогло PhpStorm разрешать методы.

/**
 * @param {Array} curVal
 */
arrays.every(function (curVal) {
    /**
     * @param {Array} curVal
     */     
    curVal.???
});

Мне это нужно для удобства, я просто хочу легко получить доступ в автозаполнении IDE Array.prototype методы на объекте curVal

2 ответа

Решение

Я не знаю, насколько умен PhpStorm ( в документах говорится, что он распознает теги компилятора Closure и аннотации типов), но я могу придумать два возможных решения.

Во-первых, нужно прямо сказать тип функции param:

arrays.every(/** @param {Array} curVal */ function (curVal) {
  // ...
});

Или (Закрытый стиль компилятора):

arrays.every(function (/** Array */ curVal) {
  // ...
});

Во-вторых, и это будет работать, только если PhpStorm достаточно умен, чтобы знать, как Array.prototype.every обратный вызов получает свои аргументы, чтобы убедиться, что он знает arrays это массив массивов:

/** @type {Array.<Array>} */
var arrays = getArrays();

Или же:

var arrays = /** Array.<Array> */ getArrays();

Я думаю, что ваш лучший (и наиболее разборчивый) вариант - дать функции имя, например

/**
 * @type {Number[]}
 */
var array = [ 1, 2, 3 ];

/**
 * @param {Number} curVal
 */
var fn = function (curVal) {
    // operate on curVal
};
array.forEach(fn);

Я думаю, что вы должны (и, возможно, должны) указать тип массива, как в моем примере, а не только {Array}и я не знаю, что вы подразумеваете под arrays.every, но я предполагаю, что вы хотели использовать .forEach из объекта Array.

[Редактировать]

Хорошо, теперь я понимаю, может быть, что-то вроде этого, что вы хотите:

/**
 * @param {Array} curVal
 */
var fn = function (curVal) {
    curVal. // press Ctrl-Space here, and autocompletion will work
};

Однако, если вы действительно хотите использовать jsdoc с анонимной функцией, что-то вроде этого будет работать (и ближе всего к коду в вашем вопросе):

var arrayOfArrays = [[1,2,3], [2,3,4]]
arrayOfArrays.every(/** @param {Array} curVal */function (curVal) {
    curVal. // press Ctrl-Space here, and autocompletion will work
});

(Я использую IntelliJ JetBrains, а не их IDE PhpStorm, но они используют ту же интеграцию Javascript)

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