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记录原始函数。每次都放一个
    @typedef
    也许可以,但我不知道这个标签是否有任何副作用。另外,这是一个需要记住的额外步骤,如果您忘记了它,它不会产生明显/立即的后果我将再次讨论这一点,因为我现在为我的用例提供了一个(近乎)完美的解决方案。事实上,IntelliSense的TypeScript远远超过标准JSDoc。事实证明,您可以利用
    @template
    标记来解决上述问题,就我所见,我可以在TypeScript中完成的任何事情我也可以在JavaScript IntelliSense中完成:

    新的包装函数

    /**
     * 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);
    
    // 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;
        }
    );
    
    对我来说,唯一的缺点是内联有点难看,我觉得,但它很管用。但是,请注意,这可能不是true/vanilla JSDoc的有效解决方案。如果像我一样,您不真正使用/关心JSDoc,并且您真的只是为了IntelliSense文章而来,那么这个解决方案是非常好的