You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

React中图片元素事件监听的类型标注错误问题问询

解决方案

你错误地使用了React的合成事件类型React.ChangeEvent<HTMLImageElement>,但这里是直接操作原生DOM的Image实例,添加的是原生DOM事件监听器,对应的回调参数应该用原生Event类型,而非React合成事件类型。

正确的类型标注写法

方式1:类型断言

直接将事件的target断言为HTMLImageElement,明确其类型:

const imageFound = (e: Event) => {
  const imgTarget = e.target as HTMLImageElement;
  imgTarget.src && found.push(imgTarget.src);
};

const imageNotFound = (e: Event) => {
  const imgTarget = e.target as HTMLImageElement;
  window?.console && console.warn("Preload image failed!", imgTarget.src);
};

方式2:类型守卫(更安全)

通过类型守卫判断target的实际类型,避免断言可能带来的风险:

const imageFound = (e: Event) => {
  if (e.target instanceof HTMLImageElement) {
    e.target.src && found.push(e.target.src);
  }
};

const imageNotFound = (e: Event) => {
  if (e.target instanceof HTMLImageElement) {
    window?.console && console.warn("Preload image failed!", e.target.src);
  }
};

原因说明

React的合成事件(如ChangeEvent)仅适用于React组件上绑定的事件(比如<input onChange={...} />),而你这里是通过new Image()创建原生DOM元素,调用原生addEventListener绑定事件,此时回调接收的是浏览器原生的Event对象,它的target默认是EventTarget类型,没有src属性,所以需要通过类型断言或守卫来指定为HTMLImageElement,才能安全访问src属性。

内容的提问来源于stack exchange,提问作者Neketo

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.06 10:10:57