Google闭包编译器将类型从EventTarget强制转换为Node

Google Closure Compiler coerce type from EventTarget to Node

本文关键字:转换 Node EventTarget 闭包 编译器 类型 Google      更新时间:2023-09-26

我正试图编译我的程序,该程序在图像上有一个点击事件侦听器,我正试图检查点击是发生在特定元素上还是其他元素上。

function(e){
    var img_wrapper = goog.dom.getElementsByClass('imgWrapper');
    if (img_wrapper.length > 0 &&  goog.dom.findCommonAncestor(e.target, img_wrapper[0]) === img_wrapper[0]){
        return;
    }
}

当我编译时,我得到了这个错误:

flickr_closure.js:226: WARNING - actual parameter 1 of goog.dom.findCommonAncestor does not match formal parameter
found   : (EventTarget|null)
required: (Node|null|undefined)
  if (img_wrapper.length > 0 &&  goog.dom.findCommonAncestor(e.target, img_wrapper[0]) === img_wrapper[0]){
                                                         ^
0 error(s), 1 warning(s), 97.0% typed

代码按照我希望的方式工作,但我仍然会收到警告,由于这是针对学校作业的,其中一个要求是在编译时不能有警告。

我曾尝试为e.target添加一些基本类型信息,试图告诉编译器将其视为Node,但它也对此表示不满。

使用所谓的类型转换:

/** @type {Node} */ (e.target)

例如

goog.dom.findCommonAncestor(/** @type {Node} */ (e.target), img_wrapper[0])

根据Alex的回答,在实际检查变量后键入cast是一种很好的做法。

if(goog.dom.isElement(e.target)) {
  .... /** @type {!Element} */ (e.target) ....
}