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

React中useState定义KeyboardEvent类型状态的默认值问题

解决React监听document keydown时useState的TypeScript类型问题

在React组件中监听document的keydown事件时,尝试用useState存储键盘事件,但设置默认值时遇到了TypeScript类型错误:

原代码如下:

import { useState, useEffect } from "react";
import { render } from "react-dom";

function App() {
  const [keyEvent, setKeyEvent] = useState<KeyboardEvent>()

  function handleDocumentKeyDown(event: any) {
        setKeyEvent(event)
    }

    useEffect(() => {
        // 无法在input上用React的onKeyDown,因为事件不会在input外触发
        document.addEventListener('keydown', handleDocumentKeyDown)

        return () => {
            document.removeEventListener('keydown', handleDocumentKeyDown)
        }
    }, [])

  return (
    <div>
    </div>
  );
}

const rootElement = document.getElementById("root")
render(<App />, rootElement)

尝试设置useState<KeyboardEvent>({})时,抛出错误:

Argument of type '{}' is not assignable to parameter of type 'KeyboardEvent | (() => KeyboardEvent)'.

尝试设置useState<KeyboardEvent>(null)时,抛出错误:

Argument of type 'null' is not assignable to parameter of type 'KeyboardEvent | (() => KeyboardEvent)'.ts(2345)

解决方法

TypeScript中KeyboardEvent是严格的接口类型,空对象{}和null都不符合它的定义。我们需要调整状态的类型,允许初始值为undefined或null:

  1. 允许初始值为undefined
    将状态类型定义为KeyboardEvent | undefined,useState不传参数时默认值就是undefined,完全符合类型要求:
const [keyEvent, setKeyEvent] = useState<KeyboardEvent | undefined>();
  1. 允许初始值为null
    将状态类型定义为KeyboardEvent | null,然后显式传入null作为初始值:
const [keyEvent, setKeyEvent] = useState<KeyboardEvent | null>(null);

另外建议优化事件处理函数的类型,不要用any,直接指定为KeyboardEvent:

function handleDocumentKeyDown(event: KeyboardEvent) {
  setKeyEvent(event);
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.08 12:55:23