Javascript IntelliSense/JSDoc@param=@return,也称为。如何记录包装器函数?
我有一个函数,它接受另一个函数作为参数,对该函数参数执行某些操作,然后返回同一个函数参数(或者至少返回一个签名完全相同的函数)Javascript IntelliSense/JSDoc@param=@return,也称为。如何记录包装器函数?,javascript,node.js,visual-studio-code,intellisense,jsdoc,Javascript,Node.js,Visual Studio Code,Intellisense,Jsdoc,我有一个函数,它接受另一个函数作为参数,对该函数参数执行某些操作,然后返回同一个函数参数(或者至少返回一个签名完全相同的函数) /** *参数和返回值应该相同(就JSDoc而言)! *@param{Function}fnToWrap *@returns{fnToWrap} */ 函数包装器函数(fnToWrap){ //做点什么。。。 返回fnToWrap; } 然而,正如你从我在下面的评论中看到的 /** *智能感知检测到这个。。。 *@param paramA *@返回 */ var Ar
/**
*参数和返回值应该相同(就JSDoc而言)!
*@param{Function}fnToWrap
*@returns{fnToWrap}
*/
函数包装器函数(fnToWrap){
//做点什么。。。
返回fnToWrap;
}
然而,正如你从我在下面的评论中看到的
/**
*智能感知检测到这个。。。
*@param paramA
*@返回
*/
var ArricryFn=函数(paramA){
返回参数*2;
}
//但不是这个!!!
var wrappedArbitraryFn=包装函数(任意fn);
。。。调用arbiryfn()
时,IntelliSense将自动完成,但不会调用wrappedArbitraryFn()
有没有办法让IntelliSense使用与未包装函数相同的签名动态自动完成我的包装函数,即不必显式地重新记录每个新包装的函数?这并不是我想要的,但在发布了这个问题后,我发现了一个不错的方法:
/**
*@type{arbitraryFn}
*/
var wrappedArbitraryFn=包装函数(任意fn);
这是可行的,也不太乏味,但是请注意以下几点:
- 这需要预先定义原始函数。换句话说,我不能让它对包装函数调用中声明的函数起作用,例如,这对
var wrapped=wrapperFunction((a,b)=>a+b)
- 如果尝试在Visual Studio Code中使用“重命名符号”命令(F2)重命名函数,则此操作将中断,除非使用
@typedef
记录原始函数。每次都放一个
也许可以,但我不知道这个标签是否有任何副作用。另外,这是一个需要记住的额外步骤,如果您忘记了它,它不会产生明显/立即的后果我将再次讨论这一点,因为我现在为我的用例提供了一个(近乎)完美的解决方案。事实上,IntelliSense的TypeScript远远超过标准JSDoc。事实证明,您可以利用@typedef
标记来解决上述问题,就我所见,我可以在TypeScript中完成的任何事情我也可以在JavaScript IntelliSense中完成: 新的包装函数@template
/** * The param and return should be the same (as far as JSDoc is concerned)! * @template {Function} T * @param {T} fnToWrap * @returns {T} */ function wrapperFunction(fnToWrap) { // Does something... return fnToWrap; }
/** * IntelliSense detects this... * @param {Number} paramA */ function previouslyDeclared(paramA) { return paramA * 2; } // And it also detects this! var afterWrapping = wrapperFunction(previouslyDeclared);
包装以前声明的函数// And it also detects this! var wrappedArbitraryFn = wrapperFunction( /** * IntelliSense detects this * @param {String} a * @param {Number} b * @param {Function} c * @returns */ (a, b, c) => { return 22; } );
/** * The param and return should be the same (as far as JSDoc is concerned)! * @template {Function} T * @param {T} fnToWrap * @returns {T} */ function wrapperFunction(fnToWrap) { // Does something... return fnToWrap; }
/** * IntelliSense detects this... * @param {Number} paramA */ function previouslyDeclared(paramA) { return paramA * 2; } // And it also detects this! var afterWrapping = wrapperFunction(previouslyDeclared);
包装内联函数// And it also detects this! var wrappedArbitraryFn = wrapperFunction( /** * IntelliSense detects this * @param {String} a * @param {Number} b * @param {Function} c * @returns */ (a, b, c) => { return 22; } );
/** * The param and return should be the same (as far as JSDoc is concerned)! * @template {Function} T * @param {T} fnToWrap * @returns {T} */ function wrapperFunction(fnToWrap) { // Does something... return fnToWrap; }
/** * IntelliSense detects this... * @param {Number} paramA */ function previouslyDeclared(paramA) { return paramA * 2; } // And it also detects this! var afterWrapping = wrapperFunction(previouslyDeclared);
对我来说,唯一的缺点是内联有点难看,我觉得,但它很管用。但是,请注意,这可能不是true/vanilla JSDoc的有效解决方案。如果像我一样,您不真正使用/关心JSDoc,并且您真的只是为了IntelliSense文章而来,那么这个解决方案是非常好的// And it also detects this! var wrappedArbitraryFn = wrapperFunction( /** * IntelliSense detects this * @param {String} a * @param {Number} b * @param {Function} c * @returns */ (a, b, c) => { return 22; } );