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

时间:2017-07-14 15:50:30

标签: javascript phpstorm anonymous-function jsdoc

我想用JSDoc描述curVal

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

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

我需要它以方便,我只想轻松访问IDE在对象Array.prototype

上的自动完成curVal方法

2 个答案:

答案 0 :(得分:1)

我认为你最好的(也是最清晰的)选项是为函数命名,例如

/**
 * @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&#39; IntelliJ,而不是他们的PhpStorm IDE,但他们共享相同的Javascript集成)

答案 1 :(得分:1)

我不知道PhpStorm是多么聪明(the docs说它识别Closure Compiler tags and type annotations),但我可以想到两种可能的解决方案。

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

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

或(Closure Compiler内联样式):

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

其次,这只有在PhpStorm足够聪明才能知道Array.prototype.every的回调如何得到它的参数时才会起作用,就是确保它知道arrays是一个数组数组:

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

或者:

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