I have a function which takes in another function as an argument, does something to that function-argument, and then returns that same function-argument (or at least returns a function with the exact same signature to it)
/** * The param and return should be the same (as far as JSDoc is concerned)! * @param {Function} fnToWrap * @returns {fnToWrap} */ function wrapperFunction(fnToWrap) { // Does something... return fnToWrap; }
However, as you can see from my comments in the following…
/** * IntelliSense detects this... * @param paramA * @returns */ var arbitraryFn = function(paramA) { return paramA * 2; } // But NOT this!!! var wrappedArbitraryFn = wrapperFunction(arbitraryFn);
… IntelliSense will autocomplete when calling arbitraryFn()
but not wrappedArbitraryFn()
.
Is there any way to get IntelliSense to dynamically autocomplete my wrapped functions with the same signature as their unwrapped counterparts, i.e. without having to explicitly re-document every newly-wrapped function?
Advertisement
Answer
I’m revisiting this again as I now have a (near-)perfect solution for my use-case. The reality is IntelliSense is far more TypeScript than it is standard JSDoc. As it turns out, you can leverage the @template
tag to solve the above, and as far as I’ve seen, anything I can accomplish in TypeScript I can also accomplish in JavaScript IntelliSense:
The New Wrapper Function
/** * 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; }
Wrapping a Previously-Declared Function
/** * IntelliSense detects this... * @param {Number} paramA */ function previouslyDeclared(paramA) { return paramA * 2; } // And it also detects this! var afterWrapping = wrapperFunction(previouslyDeclared);
Wrapping an inline Function
// 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; } );
Only downside for me is the inline is a bit ugly, imo, but it works. However, do note that this may not be a valid solution for true/vanilla JSDoc. This solution is great if, like me, you don’t really use/care about JSDoc and you’re really just here for the IntelliSense piece.