簡體   English   中英

Google Closure編譯器發出警告:類型不兼容; 即使參數具有通用類型,有沒有辦法解決?

[英]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>jQuerynull (盡管null可能很好,因為第二個參數應該是可選的)。

除了編輯jQuery定義以允許其他類型之外,還有其他方法嗎?

我知道我們可以像這樣強制轉換參數:

jtag.attr("title", /** @type {string} */ (title.val()));

但是對於這種“簡單”的事情,數百演員表聽起來很瘋狂。

在這種情況下,Google Closure編譯器無法很好地工作。 類型檢查的作用是防止出現愚蠢的錯誤,例如在需要布爾值的地方傳遞數組。 在您的情況下,編譯器無法判斷您傳遞的對象是數組(不可接受)還是字符串(可接受)。 由於您可能會給它提供不可接受的值,因此它將發出警告。

解決方案是您觀察到自己使用類型轉換來告知編譯器在這些特定情況下返回的特定類型。

其他可能性是禁用類型檢查或將這些警告標記為已知警告,以使它們不會打擾您(通過抑制或列入白名單)。

如果很常見,那么最好使用助手函數通過運行時類型檢查,“類型轉換”類型表達式或類似的方法來斷言正確的類型:

/** 
  @param {whatever} title
  @return {string} 
 */
function getVal(title) {
  var val = title.val();
  if (typeof val != "string") {
    throw Error("expected string");
  }
  return val;
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM