如何描述传递的匿名函数的参数?

How to describe parameters of passed anonymous function?

我想用 JSDoc 描述 curVal

我在 arrays.every() 之前和匿名回调中尝试了 @param,但它对 PhpStorm 解析方法没有帮助。

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

为了方便起见,我需要它,我只想轻松访问对象 curVal

上的 IDE 自动完成 Array.prototype 方法

我认为最好(也是最清晰)的选择是给函数起一个名字,例如

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

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

我认为你应该(也许必须)指定数组类型,就像在我的示例中一样,而不仅仅是 {Array},我不知道你所说的 arrays.every 是什么意思,但是我假设您打算使用 Array 对象中的 .forEach

[编辑]

好的,现在我明白了,也许你想要的是这样的:

/**
 * @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
});

(我使用 JetBrains 的 IntelliJ,而不是他们的 PhpStorm IDE,但它们共享相同的 Javascript 集成)

我不知道 PhpStorm 有多聪明 (the docs say it recognizes Closure Compiler tags and type annotations),但我可以想到两种可能的解决方案。

首先是直接告诉它函数参数的类型:

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();