谷歌闭包编译器发出警告:不兼容的类型;即使参数具有通用类型,有没有办法解决这个问题

Google Closure Compiler emitting warnings: incompatible types; even when parameters have common types, is there a way to fix that?

本文关键字:类型 有没有 问题 解决 警告 编译器 闭包 不兼容 谷歌 参数      更新时间:2023-09-26

我收到许多这样的警告:

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>jQuerynull(尽管 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在这种情况下不能很好地工作。类型检查的作用是防止愚蠢的错误,例如在需要布尔值的地方传递数组。在您的情况下,编译器无法判断您传递的对象是数组(不可接受)还是字符串(可接受)。由于您可能会给它一个不可接受的值,它会抛出警告。

解决方案是,正如您自己观察到的那样,使用类型转换来通知编译器在这些特定情况下返回的特定类型。

其他可能性是禁用类型检查或将这些警告标记为已知警告,这样它们就不会打扰您(通过抑制或白名单)。

相关文章: