有没有办法在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
,并且在函数的工具提示中没有提到回调定义。
是否有任何解决方法/插件可以启用此功能?
答案 0 :(得分:4)
在编写时,VSCode不支持@callback
,但有一些解决方法(一旦VSCode支持回调,我将更新此答案以反映它们起作用的版本)。
请参阅此问题以跟踪进度:
[IntelliSense] [Salsa] doesn't recognize JSDoc callback parameter #7515
编辑2018年5月8日:刚刚提交了带修复的拉取请求:
编辑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}}