Javascript Google闭包编译器发出警告:类型不兼容;即使参数具有公共类型,是否有方法解决此问题?
我收到了很多这样的警告:Javascript Google闭包编译器发出警告:类型不兼容;即使参数具有公共类型,是否有方法解决此问题?,javascript,jquery,google-closure-compiler,Javascript,Jquery,Google Closure Compiler,我收到了很多这样的警告: plugins/editor/editor.js:933: WARNING - actual parameter 2 of jQuery.prototype.attr does not match formal parameter found : (Array.<string>|jQuery|null|number|string) required: (boolean|function (number, string): ?|number|string|
plugins/editor/editor.js:933: WARNING - actual parameter 2 of jQuery.prototype.attr does not match formal parameter
found : (Array.<string>|jQuery|null|number|string)
required: (boolean|function (number, string): ?|number|string|undefined)
jtag.attr("title", title.val());
^
但是,对于这样简单的事情,数百次的强制转换听起来很疯狂。谷歌闭包编译器在这种情况下工作得不是很好。类型检查的作用是防止像传递需要布尔值的数组这样的愚蠢错误。在您的情况下,编译器无法判断您传递的对象是数组不可接受还是字符串可接受。因为您可能会给它提供一个不可接受的值,所以它将抛出一个警告 正如您自己所观察到的,解决方案是使用类型转换来通知编译器在这些特定情况下返回的特定类型
其他可能是禁用类型检查或将这些警告标记为已知警告,这样它们就不会通过抑制或白名单来打扰您。Google Closure Compiler在这种情况下不能很好地工作。类型检查的作用是防止像传递需要布尔值的数组这样的愚蠢错误。在您的情况下,编译器无法判断您传递的对象是数组不可接受还是字符串可接受。因为您可能会给它提供一个不可接受的值,所以它将抛出一个警告 正如您自己所观察到的,解决方案是使用类型转换来通知编译器在这些特定情况下返回的特定类型
其他可能的方法是禁用类型检查或将这些警告标记为已知警告,这样它们就不会因抑制或白名单而困扰您。如果这是常见的情况,最好使用帮助函数,使用运行时类型检查、类型转换类型表达式或类似的方法来断言正确的类型:
/**
@param {whatever} title
@return {string}
*/
function getVal(title) {
var val = title.val();
if (typeof val != "string") {
throw Error("expected string");
}
return val;
}
如果这是常见的,最好使用helper函数,通过运行时类型检查、类型转换类型表达式或类似方法来断言正确的类型:
/**
@param {whatever} title
@return {string}
*/
function getVal(title) {
var val = title.val();
if (typeof val != "string") {
throw Error("expected string");
}
return val;
}
当我继续编写脚本时,我遇到了两个类似的函数。但是,是的,因为这些闭包编译转换在运行时并不意味着任何东西,所以转换函数会工作得更好……转换是一种替代方法。如果使用闭包库,则goog.asserts方法在调试版本中提供运行时类型检查,并且可以在编译生产版本时删除。在我继续编写脚本时,我遇到了两个类似的函数。但是,是的,因为这些闭包编译转换在运行时并不意味着任何东西,所以转换函数会工作得更好……转换是一种替代方法。如果使用闭包库,则goog.asserts方法在调试版本中提供运行时类型检查,并且可以在编译生产版本时删除。