代码之家  ›  专栏  ›  技术社区  ›  Shorn

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

  •  29
  • Shorn  · 技术社区  · 7 年前

    Typescript 2.3.4、react 15.5.4和react bootstrap 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
        });
      }}
    />
    

    handleKeywordKeypress

    我可以这样定义它:

    handleKeywordKeypress= (e: any) =>{
      log.debug("keypress: " + e.nativeEvent.code);
    };
    

    它将被调用,并将打印出来 keypress: Enter e 这样我就可以比较价值(什么?)判断是否按下了Enter键。

    3 回复  |  直到 3 年前
        1
  •  41
  •   Shorn    4 年前

    这似乎有效:

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

    关键 (Ha) 在这里,对我来说,是为了说明 React.KeyboardEvent KeyboardEvent .

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

    type KeyboardEventHandler<T> = EventHandler<KeyboardEvent<T>>;
    

    但我在复制/粘贴时没有意识到 键盘事件 作为我的处理程序的参数类型,编译器实际上是在提取 键盘事件

        2
  •  6
  •   Tom Fenech    7 年前

    类型 onKeyPress 应该是 KeyboardEventHandler<T> ,可以用以下任一方式编写:

    handleKeywordKeypress: KeyboardEventHandler<FormControl> = e => {
        // use e.keyCode in here
    }
    

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

    正如你在回答中指出的那样,如果你选择第二个选项,你需要特别使用 KeyboardEvent 来自React。

    keyCode 可直接作为上的属性使用 e ; 您不需要通过 nativeEvent .

    此外,泛型类型参数 T FormControl 组件,而不是它的道具,所以您也应该更改其他处理程序。

        3
  •  5
  •   underfrankenwood    2 年前

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

    import { KeyboardEvent } from 'react';
    
    const handleKeyPress = (e: KeyboardEvent<HTMLInputElement>) => {
       // do stuff
    };