html - TypeScript:ev.target 和 Node.contains:EventTarget 不可分配给 Node
问题描述
这是代码:
function bodyClickHandler(ev: MouseEvent) {
if(containerRef.current && containerRef.current.contains(ev.target)) return;
setOpen(false);
}
错误:
'EventTarget | 类型的参数 null' 不可分配给“节点 |”类型的参数 空值'。“EventTarget”类型缺少“Node”类型中的以下属性:baseURI、childNodes、firstChild、isConnected 和 44 more.ts(2345)
containerRef.current
是一个HTMLDivElement
。.contains
应该是这个功能。
不ev.target
保证是Node
某种?
我可以施放它(ev.target as Node
),但我想弄清楚在什么情况下这可能会失败?我可以点击什么不是节点?
解决方案
简短的回答:这是由于他们的打字错误。继续施放它。
长答案:发生这种情况的原因是,如果您单击<svg />
按钮内部(例如),则event.target
将指向 SVG,这不能保证是按钮(显然)。只有一个事件currentTarget
指向处理程序所在的元素。因此,制作 React 类型的人决定他们将和事件定义currentTarget
为button
我们示例中的内容,但不保证事件的内容,target
除非它是一个 EventTarget。因此,您必须坚持使用它。这在本 PR中进行了讨论。
推荐阅读
- netbeans - 当重构错误后无法解决时,如何清理和重建 netbeans 中的项目?
- java - RxNetty 重用连接
- python - 'Return' 究竟做了什么,我应该在何时何地使用它?
- javascript - 在动态大小的文本区域中垂直居中占位符
- javascript - 显示从 firebase 到 ionic 的数据时出错
- acumatica - 自定义长操作成功消息
- javascript - 无法从包含的数据中选择特定元素
- python-3.x - 无法让编码在 python 3 中工作
- ios - 处置(取消)可观察的。SubscribeOn 和 observeOn 不同的调度器
- c - 多次调用 char[] 返回函数用于立即 fprint