我在google closure的高级编译模式中将以下方法的返回类型分配给整数类型的变量时遇到了问题。另外,我不想使用getter / setter方法替代下面的代码。
/**
* Sets the idNum of this shape.
* @override
* @param {...number} id The number to set idNum, optional parameter.
* @returns {number} Returns idNum if nothing is passed in.
*/
app.Shape.prototype.idNum = function(id) {
if(goog.isDef(id)) {
this._idNum = id;
} else {
return this._idNum;
}
};
我应该如何更新我的注释 @Returns 因此,上述方法可能会或可能不会返回数字,具体取决于传递的参数。
答案 0 :(得分:2)
将相同的函数同时作为getter和setter是有点奇怪,具体取决于它的调用方式。但无论如何:使用=
作为可选参数:{number=}
。对于“可选返回”,您可以将返回类型写为{number|undefined}
,因为如果没有单击“return”语句,该函数将返回undefined。有关详情,请参阅Annotating JavaScript for the Closure Compiler。
答案 1 :(得分:0)
Closure Compiler不支持为函数设置多个签名,您基本上需要:
/** @type {(function(number):undefined)|(function():number)} */
目前,编译器将其合并为“Function”。更具体地说,你想说的不是它们是那些类型,而是两种类型,现在没有类似的东西。
虽然您可以手动将函数签名合并为:
/**
* @param {number=} opt_id
* @return {number|undefined}
*/
这意味着返回类型总是“数字|未定义”,当指定参数时返回类型不是“未定义”,否则当消费者不得不将结果“缩小”为“数字”或“数字”时返回“数字”未定义“每次通话后都是一个尴尬的api。
答案 2 :(得分:0)
虽然在许多情况下让某个函数既是getter又是setter并不奇怪,但是你正在反对Closure Compiler试图为你做的事情。
JavaScript是松散类型的,意味着任何东西都可以是"这种类型或者那种类型或其他类型的OR ...."对此列表的大小没有限制。
CC正试图通过强制执行强类型来提供帮助。最强的打字方式坚持认为给定的变量是#34;这只是一种类型",但这种僵化往往是一种痛苦(特别是不允许NULL或UNDEFINED值)。 CC通过允许"仅限几种类型来放松这一点。你必须拼出来的。但是,你应该意识到这种放松只是向后退了一小步,朝向松散打字的狂野西部。
如果您使用CC来改进代码,那么请听听它试图告诉您的内容。如果你发现自己正在努力为某些东西找到合适的注释,或者你的类型列表正在增长,那么你可能需要首先重新考虑你对CC的使用和强类型。
就个人而言,我更喜欢强类型和更简单,更简洁,更清晰的代码。在你的例子中,CC试图通过斜方式暗示结合getter和setter功能的方法来提供帮助。