如何记录调用另一个函数的函数的返回值
How to document return value of function that calls another function
给定以下示例:
/**
* An outer function
* @param {number} age - The age to pass to outerFunction
* @returns {#What goes here?#}
*/
function outerFunction(age){
return addTen(age)
}
/**
* Adds 10 to the age
* @param {number} age - The age to add 10 to
* @returns {number} - The age + 10
*/
function addTen(age){
return 10 + age
}
则CCD_ 1返回另一个函数的结果。
我想了几种方法来记录这一点:
@returns {number}
-我们知道addTen
返回一个数字,但是如果这个数字改变了呢?我们将不得不同时更新这两个(或者每次返回时都要更新,这可能会很多),这是不可维护的。@returns {function}
-我不确定JsDoc中是否有此功能。我哪儿也找不到。这也没有提供太多信息。@returns {any}
或-@returns {*}
-这对阅读文档的人没有特别的帮助。
由于上述原因,我觉得这些都不正确。
我想我想要像一样的东西
@returns {addTen.return}
因此,我本质上是在说"outerFunction
返回addTen
所做的任何类型"。
注意:在这个例子中,它们在同一个地方,但可能包含在多个文件中,所以使用这种方法是行不通的,除非可以在多个档案中执行。
我们如何编写JsDoc注释来记录该函数返回另一个函数?
是否存在与我的建议类似的内容?
outerFunction
的调用方将对该函数作为参数接受的内容以及它将返回的内容有一定的期望。outerFunction
0的调用者并不关心outerFunction
做什么,只关心它的接口按照描述工作。outerFunction
的调用方不知道或不关心,也不应该关心某个名为addTen
的函数参与了outerFunction
所做的任何事情。事实上,有一天您可能会重写outerFunction
的整个实现,不再调用addTen
,而是保持它的行为完全相同。
将每个功能单独视为一个黑盒。你在描述outerFunction
的接口,所以描述它做什么/应该做什么。不要用其他可能相关或不相关的功能来描述它。如果outerFunction
预计会返回一个数字,请这样描述它。如果addTen
碰巧也返回了一个数字,那么,这真是巧合。
我理解隐含地将一个函数的返回值与另一个函数返回值联系起来的动机,因为这就是它的实际实现方式,你知道。。。DRY和所有。。。但在这种情况下,这会适得其反。在两个不同的函数上"重复"关于返回类型的"相同信息"并不重要;因为你不是在描述一个相连的东西。这两个功能都是独立的黑盒,具有各自的特定签名;它们的实现恰好是耦合的,这与此无关,事实上明天可能会发生变化。重要的是签名保持原样。
事实上,如果addTen
确实更改了它的返回类型(并且outerFunction
也隐式地更改了它),那么无论如何,这将是一件大事,而不仅仅是通过隐式更新一些文档来破坏它。通过更改任何函数的返回类型,您就打破了以前建立的契约,这将对该函数的每个用户产生一连串的影响。在这种情况下,隐式自动更新outerFunction
的返回类型是最不担心的,因为您可能需要重写大量代码以符合新合同。
这是一个老问题,但我最近刚刚遇到类似的问题。我将把我的解决方案留给任何有这个问题的人参考。但请注意,我所需要的只是VS代码中的一些类型提示。如果你正在使用一些docgen工具,或者你只能使用官方的jsdoc语法,那么这个答案可能不适合你。
因此,在本例中,如果您只需要编辑器中的一些类型提示,则不需要向outerFunction
:添加任何返回类型
/**
* An outer function
* @param {number} age - The age to pass to outerFunction
*/
function outerFunction(age){
return addTen(age)
}
以上代码将自动工作(如果正确键入addTen
)。但如果您真的需要引用addTen
的返回类型,例如:
// The param `addedAge` is definitely something returned by `addTen`
function outerFunction(addedAge) {
return addedAge + addTen(10) // becomes `any`
}
在本例中,如果addedAge
是一个数字,则outerFunction
返回一个数字;如果addedAge
是一个字符串,那么它也会返回一个字符串。在这种情况下,您可以:
/**
* @param {ReturnType<addTen>} addedAge
* @returns {ReturnType<addTen>}
*/
function outerFunction(addedAge) {
return addedAge + addTen(10)
}
同样,这不是官方的jsdoc语法,但对于像VS Code这样的编辑器,打字系统是建立在TypeScript之上的,因此您可以直接使用TypeScript功能。
此外,您甚至可以在jsdoc:中导入一个类型(或函数)
/**
* @param {ReturnType<import('../fn').addTen>} addedAge
*/
function outerFunction(addedAge) {
return addedAge + addTen(10)
}
对于那些想要一些类型但还不能迁移到TypeScript的人,我希望这会有所帮助。
- 如何在JQuery函数中定义一个值,然后调用另一个函数并使用该值
- 是否可以将一个函数输入连接到另一个函数调用的文本
- 在另一个函数中使用变量this
- 在另一个函数成功结束后调用该函数
- 多次调用另一个javascript函数中的javascript函数
- 使用JS函数来使用另一个函数的语法?node.js
- 嵌套到另一个函数中的Fancybox函数;不起作用
- 如何从onclick函数设置全局变量并将其传递给另一个JS文件
- javascript函数将数据添加到屏幕,但随后被另一个函数覆盖
- 另一个Ajax函数触发的Ajax函数不起作用
- 如何从另一个处理程序内部取消JavaScript事件处理程序函数的执行
- 如何在不预定义的情况下将javascript函数传递到另一个函数中
- 从另一个函数获得$this值
- 如何记录调用另一个函数的函数的返回值
- 它在另一个函数中嵌套后不会输出文本
- 如何将自动完成的值传递到另一个函数中
- 将一个函数作为参数传递给javascript中的另一个函数
- 同一事物的两个函数,一个崩溃,另一个不崩溃,为什么
- 从另一个函数延迟解析的返回
- 多次调用promise函数,直到另一个promise函数满足条件