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

TypeScript参数类型检查:React组件中如何编写事件类型判断条件?

如何在React/TypeScript中区分鼠标事件与键盘事件类型

嘿,这个场景我太熟悉啦!在React + TypeScript里要区分鼠标事件和键盘事件,用TypeScript的类型守卫就能轻松搞定,给你分享几种实用的写法:

方法一:通过原生事件实例判断

React的合成事件包装了原生事件,我们可以直接通过nativeEvent的instanceof来判断类型,TypeScript会自动做类型推断:

function foo(e: React.MouseEvent<HTMLElement> | React.KeyboardEvent<HTMLElement>) {
  if (e.nativeEvent instanceof MouseEvent) {
    // 这里TypeScript会自动识别e为React.MouseEvent<HTMLElement>
    console.log('这是鼠标事件,点击的按钮序号:', e.button);
    console.log('鼠标点击坐标:', e.clientX, e.clientY);
  } else if (e.nativeEvent instanceof KeyboardEvent) {
    // 这里自动推断为React.KeyboardEvent<HTMLElement>
    console.log('这是键盘事件,按下的按键:', e.key);
    console.log('按键对应的编码:', e.code);
  }
}

方法二:检查事件对象的专属属性

利用两种事件的独有属性(比如鼠标事件有button,键盘事件有key),用in操作符做类型守卫,写法更简洁:

function foo(e: React.MouseEvent<HTMLElement> | React.KeyboardEvent<HTMLElement>) {
  if ('button' in e) {
    // 此时e被推断为鼠标事件类型
    console.log('鼠标事件,点击目标:', e.currentTarget);
  } else {
    // 剩下的自然就是键盘事件类型
    console.log('键盘事件,是否按住Shift:', e.shiftKey);
  }
}

方法三:自定义类型谓词函数(适合复用场景)

如果需要在多个地方重复判断事件类型,可以写一个自定义的类型谓词函数,让代码更复用、更清晰:

// 自定义类型守卫函数,返回布尔值同时告诉TypeScript类型
function isMouseEvent(
  e: React.MouseEvent<HTMLElement> | React.KeyboardEvent<HTMLElement>
): e is React.MouseEvent<HTMLElement> {
  return 'button' in e;
}

function foo(e: React.MouseEvent<HTMLElement> | React.KeyboardEvent<HTMLElement>) {
  if (isMouseEvent(e)) {
    console.log('鼠标事件的触发元素:', e.target);
  } else {
    console.log('键盘事件的触发元素:', e.target);
  }
}

这几种方法都能完美解决你的问题,根据自己的场景选就行啦~

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 04:27:16