如何让Closure Compiler在调用函数时不再抱怨联合类型?

10

我在使用jQuery-1.4.3 externs文件时特别注意到了这一点。该文件的javadoc如下:

/**
 * @param {(string|number|function(number,number))=} arg1
 * @return {(number|jQueryObject)}
 * @nosideeffects
 */
jQueryObject.prototype.width = function(arg1) {};

我有一个这样的调用:

   var w =  $(window).width();
    $('#whatever').width(w)
Closure 报错: 警告 - jQueryObject.prototype.height 的实际参数1与形式参数不符 找到的内容:(jQueryObject|null|number) 所需内容:(function (number, number): ?|number|string|undefined) $('#Xobni').height($(window).height());
经过尝试(删除可能的返回类型),我发现问题在于第一次调用 width 可能会返回一个 jQueryObject ,而这不是有效的输入,因此 Closure 给出了错误。我尝试添加以下代码:
/**
 * @type {number}
 */
var w =  $(window).width();
$('#Xobni').width(w);

但是Closure抱怨:

警告 - 初始化变量

找到:(jQueryObject|null|number)

需要:number

var w = $(window).width();

问题在于当width带有参数时,它返回的是一个jQuery对象。 当它没有带参数时,它返回的是一个数字。 所以我知道我的调用没问题,但javadoc并没有完全反映这一点,所以Closure会发出警告。 有没有一种方法可以适当修复javadoc或者告诉Closure我知道这个结果将是一个数字。 我知道我可以抑制错误,但我想知道如何更好地注释这些内容。

感谢你的帮助!

2个回答

8
你可以按照以下方式进行覆盖:
var w = /** @type {number} */ ($(window).width());
$('#whatever').width(w)

太好了,完美运行。谢谢!如果我使用以下代码,它甚至可以内联工作: $('#whatever').width(/** @type {number} */ $(window).width()); - Mr. Ubin

2

试试这个:

var w =  $(window).width();
w = parseInt(w.toString());
$('#whatever').width(w);

或者这个:
var w =  $(window).width() + '';
$('#whatever').width(w);

谢谢!那其实是我为了解决这个问题所做的,但nullptr的帖子提供了一个不涉及任何运行时机制的好方法。 - Mr. Ubin

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接