谷歌闭包编译器发出警告:不兼容的类型;即使参数具有通用类型,有没有办法解决这个问题
Google Closure Compiler emitting warnings: incompatible types; even when parameters have common types, is there a way to fix that?
我收到许多这样的警告:
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());
^
在这种情况下,我想使用 jQuery 设置一个属性,我们看到 title.val() 返回一个string
类型,而 attr() 第二个参数接受一个string
。但是,我认为编译器希望找到的所有类型都与所需的类型兼容。
在这种情况下,我想警告意味着 attr() 函数的可能输入中缺少Array.<string>
、jQuery
和null
(尽管 null 可能很好,因为第二个参数应该是可选的)。
除了编辑jQuery定义之外,还有其他方法可以允许其他类型吗?
我知道我们可以像这样转换参数:
jtag.attr("title", /** @type {string} */ (title.val()));
但是对于这种"简单"的事情,数百个演员听起来很疯狂。
如果这很常见,最好使用帮助程序函数,通过运行时类型检查、"类型转换"类型表达式或类似表达式来断言正确的类型:
/**
@param {whatever} title
@return {string}
*/
function getVal(title) {
var val = title.val();
if (typeof val != "string") {
throw Error("expected string");
}
return val;
}
Google Closure Compiler在这种情况下不能很好地工作。类型检查的作用是防止愚蠢的错误,例如在需要布尔值的地方传递数组。在您的情况下,编译器无法判断您传递的对象是数组(不可接受)还是字符串(可接受)。由于您可能会给它一个不可接受的值,它会抛出警告。
解决方案是,正如您自己观察到的那样,使用类型转换来通知编译器在这些特定情况下返回的特定类型。
其他可能性是禁用类型检查或将这些警告标记为已知警告,这样它们就不会打扰您(通过抑制或白名单)。
相关文章:
- 有没有任何方法可以将控制器从文件加载到ui路由器$stateProvider中
- 有没有一种方法可以添加相同的项目val=“0”;4〃;到JavaScript中数组的每个对象
- 有没有一种方法可以防止img get请求使用css或js发生
- Javascript,有没有一种方法可以将数组写成没有逗号或空格的单个文本字符串
- 有没有一个javascript图形绘制库可以进行气球树布局
- 有没有一种方法可以通过列类型/属性来格式化MySQL单元格数据
- 有没有一种方法可以在Typescript中自动检查数据类型的数据相等性
- 有没有一种方法可以在泛型(<T>)函数/类(Typescript)中获取泛型类型的名称
- 有没有任何方法可以从javascript进行跨域请求,并访问它可能生成的错误响应类型(401404等)
- 有没有一种方法可以制作一个prezi,然后以某种方式将其转换为html和css类型的代码
- 有没有办法更改c3.js中子图表的类型
- 有没有一种更快的方法来查找客户端和服务器端的所有图像、音频和视频文件类型
- 除了在 AngularJS 中为每种类型的编辑创建一个函数之外,有没有更好的方法可以在页面上拥有可编辑的元素
- 有没有办法在JS文档中定义泛型类型
- 有没有一种方法可以在谷歌闭包编译器中使用枚举作为类型
- 类型错误:将循环结构转换为 JSON:有没有办法忽略此警告
- ENYO-有没有ENYO类型可以从预定义的电子邮件域列表中建议并自动完成域后缀
- 有没有办法在javascript中获取返回值的类型
- 谷歌闭包编译器发出警告:不兼容的类型;即使参数具有通用类型,有没有办法解决这个问题
- 无论如何,有没有知道特定类型的javascript变量