VS Code中的jsDoc @callback

时间:2017-09-27 08:40:55

标签: javascript jsdoc

有没有办法在VS Code中使用jsDoc的@callback标记?

我尝试从jsDoc documentation of the callback tag

剪切以下代码
/**
 * @class
 */
function Requester() {}

/**
 * Send a request.
 * @param {requestCallback} cb - The callback that handles the response.
 */
Requester.prototype.send = function(cb) {
    // code
};

/**
 * This callback is displayed as a global member.
 * @callback requestCallback
 * @param {number} responseCode
 * @param {string} responseMessage
 */

但是VS Code似乎没有正确解释标签,你的参数类型仍然是any,并且在函数的工具提示中没有提到回调定义。

是否有任何解决方法/插件可以启用此功能?

1 个答案:

答案 0 :(得分:4)

在编写时,VSCode不支持@callback,但有一些解决方法(一旦VSCode支持回调,我将更新此答案以反映它们起作用的版本)。

请参阅此问题以跟踪进度:

  

[IntelliSense] [Salsa] doesn't recognize JSDoc callback parameter #7515

编辑2018年5月8日:刚刚提交了带修复的拉取请求:

  

Add callback tag, with type parameters

编辑2018年5月17日:修复已合并到TypeScript 2.9.1中,可能会出现在VS Code的下一个版本中

建议@typedef使用/** * @typedef {function(number)} addedCallback */ /** *@param {addedCallback} a */ var add = function (a) { } 的不完整解决方法:

@callback

然而,正如后面的一些评论所指出的那样:

  

/** * A compare function to pass to `indices.sort()`, see also: * [`TypedArray.prototype.sort()`](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/TypedArray/sort). * * @param {number} i * @param {number} j */ function indexCompareFunction(i, j) { // dummy function for missing VSCode JSDoc callback support return i - j; } // Explicit /** * Creates a compare function to sort a _separate_ array * of indices, based on lexicographical ordering of * the array values. Produces a stable sort. * @param {*[]} array * @returns {indexCompareFunction} */ function baseCompareFunc(array) { return (i, j) => { let vi = array[i], vj = array[j]; return vi < vj ? -1 : vi > vj ? 1 : i - j; }; } // Inferred from callback JSDoc /** * @param {*[]} array */ function baseCompareFunc2(array) { // Must store the function in a variable, // otherwise JSDoc does nothing! /** * @param {number} i * @param {number} j */ let compareFunc = (i, j) => { let vi = array[i], vj = array[j]; return vi < vj ? -1 : vi > vj ? 1 : i - j; }; return compareFunc; } 的真正用途是正确描述回调的所有参数,有时还包括预期的返回值及其对当前函数的影响。

该注释还为两个选项提供了更完整的解决方法:创建虚拟函数,或者记录回调本身。

如果您使用像Webpack这样的构建工具,并将其设置为消除未使用的变量和函数,那么&#34; dummy&#34;功能不会显示您的生产代码。

以下是两种解决方法的示例,基于in an early comment in the thread

/**
 * Creates a compare function for sorting a set of *indices*
 * based on lexicographical comparison of the array values
 * @param {*[]} array
 * @returns {{(i:number, j:number)=> number}}
 */
function baseCompareFunc(array) {
  return (i, j) => {
    let vi = array[i],
      vj = array[j];
    return vi < vj ?
      -1 :
      vi > vj ?
        1 :
        i - j; // the part that makes this a stable sort
  };
}

编辑:还有另一个更短的解决方法,它依赖于VSC的TypeScript支持。它技术上不是&#34;标准&#34; JSDoc。如果重要或不重要,请自行决定。正如其中一位开发人员所解释的那样:

  

在{..}内,我们允许使用TypeScript类型语法,这就是在TS中定义呼叫签名的方式。

{{1}}