如何解决IntelliSense/JSDoc @param = @return,也就是我如何记录包装函数?
我有一个函数,它接受另一个函数作为参数,对那个函数参数做某事,然后返回相同的函数参数(或者至少返回一个完全相同的函数)签名)
/**
* 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;
}
但是,正如您从我下面的评论中看到的那样...
/**
* IntelliSense detects this...
* @param paramA
* @returns
*/
var arbitraryFn = function(paramA) {
return paramA * 2;
}
// But NOT this!!!
var wrappedArbitraryFn = wrapperFunction(arbitraryFn);
... IntelliSense 将在调用 arbitraryFn()
而不是 wrappedArbitraryFn()
时自动完成。
有什么方法可以让 IntelliSense动态自动完成我的包装函数,其签名与它们的未包装函数相同,即不必显式地重新记录每个新的-包装函数?
解决方法
我再次重新审视这个问题,因为我现在有一个(接近)完美的解决方案来满足我的用例。现实是 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;
}
);
对我来说唯一的缺点是内联有点难看,imo,但它有效。但是,请注意这可能不是真正/原版 JSDoc 的有效解决方案。如果您像我一样并不真正使用/关心 JSDoc,并且您真的只是为了 IntelliSense 作品而来到这里,那么此解决方案非常棒。
,这不是正是我正在寻找的,但是在发布这个问题之后,我确实发现了这个还不错的方法:
/**
* @type {arbitraryFn}
*/
var wrappedArbitraryFn = wrapperFunction(arbitraryFn);
这行得通,而且不会太乏味,但请注意以下几点:
- 这需要预先定义原始函数。换句话说,我无法让它对在调用包装器函数中声明的函数起作用,例如这不适用于
var wrapped = wrapperFunction((a,b) => a + b)
-
如果您尝试在 Visual Studio Code 中使用“重命名符号”命令 (F2) 重命名函数,这将会中断除非您使用 { 记录原始函数{1}}。每次都放一个
@typedef
可能没问题,但我不知道该标签是否有任何副作用。另外,这是一个需要记住的额外步骤,如果您忘记它也不会产生明显/直接的后果?
所以我仍然非常愿意接受答案!
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。