Typescript:Reactイベントタイプ


129

Reactイベントの正しいタイプは何ですか。最初はany、単純にするために使用しました。今、私は物事をきれいにし、any完全に使用しないようにしています。

したがって、次のような単純な形式になります。

export interface LoginProps {
  login: {
    [k: string]: string | Function
    uname: string
    passw: string
    logIn: Function
  }
}
@inject('login') @observer
export class Login extends Component<LoginProps, {}> {
  update = (e: React.SyntheticEvent<EventTarget>): void => {
    this.props.login[e.target.name] = e.target.value
  }
  submit = (e: any): void => {
    this.props.login.logIn()
    e.preventDefault()
  }
  render() {
    const { uname, passw } = this.props.login
    return (
      <div id='login' >
        <form>
          <input
            placeholder='Username'
            type="text"
            name='uname'
            value={uname}
            onChange={this.update}
          />
          <input
            placeholder='Password'
            type="password"
            name='passw'
            value={passw}
            onChange={this.update}
          />
          <button type="submit" onClick={this.submit} >
            Submit
          </button>
        </form>
      </div>
    )
  }
}

ここでは、イベントタイプとしてどのタイプを使用しますか?

React.SyntheticEvent<EventTarget>私はエラーを取得するよう動作していないようですnameし、value上は存在しませんtarget

すべてのイベントに対してより一般的な回答をいただければ幸いです。

ありがとう

回答:


145

SyntheticEventのインタフェースは、一般的な次のとおりです。

interface SyntheticEvent<T> {
    ...
    currentTarget: EventTarget & T;
    ...
}

そして、これcurrentTargetは一般的な制約との共通部分 EventTargetです。
また、イベントは入力要素によって引き起こされるため、FormEvent定義ファイルは、反応ドキュメント)を使用する必要があります。

する必要があります:

update = (e: React.FormEvent<HTMLInputElement>): void => {
    this.props.login[e.currentTarget.name] = e.currentTarget.value
}

15
すべての一般的なイベントタイプについて読むのに適した場所は何ですか?どこにも見つかりません。
r.sendecky 2017

3
Reactイベントタイプ?これらはすべて、ドキュメントのイベントページで説明されています
Nitzan Tomer 2017

3
タイプ 'EventTarget&HTMLInputElements'に 'name'が存在しない(TS v2.4)
Falieson

4
これでも、次のエラーが発生します。「プロパティ 'value'はタイプ 'EventTarget&HTMLInputElement'に存在しません。」
tomhughes

1
@CMCDragonkai e.keyキーボードイベントの一部にすぎないと思います。
Nitzan Tomer

29

問題はイベントタイプではありませんが、typescriptのEventTargetインターフェイスには3つのメソッドしかありません。

interface EventTarget {
    addEventListener(type: string, listener: EventListenerOrEventListenerObject, useCapture?: boolean): void;
    dispatchEvent(evt: Event): boolean;
    removeEventListener(type: string, listener: EventListenerOrEventListenerObject, useCapture?: boolean): void;
}

interface SyntheticEvent {
    bubbles: boolean;
    cancelable: boolean;
    currentTarget: EventTarget;
    defaultPrevented: boolean;
    eventPhase: number;
    isTrusted: boolean;
    nativeEvent: Event;
    preventDefault(): void;
    stopPropagation(): void;
    target: EventTarget;
    timeStamp: Date;
    type: string;
}

したがって、それは正しいことでnameありvalue、EventTargetには存在しません。必要なことは、必要なプロパティを持つ特定の要素タイプにターゲットをキャストすることです。この場合はになりますHTMLInputElement

update = (e: React.SyntheticEvent): void => {
    let target = e.target as HTMLInputElement;
    this.props.login[target.name] = target.value;
}

また、代わりにReact.SyntheticEventのイベントのために、あなたはまた、次のようにそれらを入力することができますEventMouseEventKeyboardEvent...など、ハンドラのユースケースに依存します。

これらすべてのタイプ定義を確認する最良の方法は、typescriptとreactの両方から.d.tsファイルをチェックアウトすることです。

詳細については、次のリンクも確認してください。 なぜEvent.targetがTypescriptの要素ではないのですか?


2
ps。型定義ファイルは汎用のSyntheticEvent <T>インターフェイスを表示しないため、少し古いようです。Nitzan Tomerからの回答の方が優れています。
エドウィン

はい、ニッツァンの答えはより明確であるようです。努力をありがとう。
r.sendecky 2017

25

ニッツァンとエドウィンの両方の答えを組み合わせるために、私はこのようなものが私にとってうまくいくことを発見しました:

update = (e: React.FormEvent<EventTarget>): void => {
    let target = e.target as HTMLInputElement;
    this.props.login[target.name] = target.value;
}

1
this.props.login [target.name] = target.value; ??? 小道具を変更します:o
Marwen Trabelsi

元の質問から行をコピーして、OPが答えを理解できるようにします。
チャム

21

私は最も簡単な方法はそれだと思います:

type InputEvent = React.ChangeEvent<HTMLInputElement>;
type ButtonEvent = React.MouseEvent<HTMLButtonElement>;

update = (e: InputEvent): void => this.props.login[e.target.name] = e.target.value;
submit = (e:  ButtonEvent): void => {
    this.props.login.logIn();
    e.preventDefault();
}

これでうまくいきました。
Benyam Ephrem

1
.ChangeEvent私にとって鍵でした
Skyy2010

3

あなたは反応してこのようにすることができます

handleEvent = (e: React.SyntheticEvent<EventTarget>) => {
  const simpleInput = (e.target as HTMLInputElement).value;
  //for simple html input values
  const formInput = (e.target as HTMLFormElement).files[0];
  //for html form elements
}
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.