Typescript/React onKeyPress 参数的正确类型是什么?

Sho*_*orn 18 typescript reactjs react-bootstrap

打字稿 2.3.4,反应 15.5.4 和反应引导 0.31.0。

我有一个FormControl,我想在用户按下回车键时做一些事情。

控制:

<FormControl
  name="keyword"
  type="text"
  value={this.state.keyword}
  onKeyPress={this.handleKeywordKeypress}
  onChange={(event: FormEvent<FormControlProps>) =>{
    this.setState({
      keyword: event.currentTarget.value as string
    });
  }}
/>
Run Code Online (Sandbox Code Playgroud)

参数的定义应该handleKeywordKeypress是什么?

我可以这样定义:

handleKeywordKeypress= (e: any) =>{
  log.debug("keypress: " + e.nativeEvent.code);
};
Run Code Online (Sandbox Code Playgroud)

这将被调用,它会打印kepress: Enter但类型应该是什么,e以便我可以将值与(什么?)进行比较以判断是否按下了 Enter 键。

Sho*_*orn 25

这似乎有效:

handleKeywordKeyPress = (e: React.KeyboardEvent<FormControl>) =>{
  if( e.key == 'Enter' ){
    if( this.isFormValid() ){
      this.handleCreateClicked();
    }
  }
};
Run Code Online (Sandbox Code Playgroud)

对我来说,这里的关键(哈哈)是指定React.KeyboardEvent,而不是KeyboardEvent

浏览 React 代码,我看到了如下定义:

type KeyboardEventHandler<T> = EventHandler<KeyboardEvent<T>>;
Run Code Online (Sandbox Code Playgroud)

但是没有意识到当我将复制/粘贴KeyboardEvent作为处理程序的参数类型时,编译器实际上KeyboardEvent是在选择 Typescript 库中定义的某种默认类型(而不是 React 定义)。

  • 如果您想简单地指定 KeyBoardEvent,则必须从 React 导入它,仅此而已。`从'react'导入{KeyboardEvent};` (4认同)

und*_*ood 15

上面的两个答案都没有解决我的问题,它应该非常简单明了:

import { KeyboardEvent } from 'react';

const handleKeyPress = (e: KeyboardEvent<HTMLInputElement>) => {
   // do stuff
};
Run Code Online (Sandbox Code Playgroud)

  • 我不知道什么是“FormControl”,我相信“HTMLInputElement”应该是正确的,因为其他事件也从那里借用。 (2认同)

Tom*_*ech 6

的类型onKeyPress应该是KeyboardEventHandler<T>,可以用以下任意一种写法:

handleKeywordKeypress: KeyboardEventHandler<FormControl> = e => {
    // use e.keyCode in here
}
Run Code Online (Sandbox Code Playgroud)

或者

import { KeyboardEvent } from "react";
handleKeywordKeypress = (e: KeyboardEvent<FormControl>) => {
    // use e.keyCode in here
};
Run Code Online (Sandbox Code Playgroud)

正如您在答案中指出的,如果您选择第二个选项,则需要专门使用KeyboardEventReact.

请注意,keyCode可以直接作为 ; 的属性使用e。您不需要通过nativeEvent.

另外,通用类型参数T应该是FormControl组件,而不是它的 props,因此您也应该更改其他处理程序。