TypeScriptのタイプEventTargetにプロパティ 'value'が存在しません


118

したがって、次のコードはAngular 4に含まれており、期待どおりに機能しない理由を理解できません。

これが私のハンドラのスニペットです:

onUpdatingServerName(event: Event) {
  console.log(event);
  this.newserverName = event.target.value; //this wont work
}

HTML要素:

<input type="text" class="form-control" (input)="onUpdatingServerName($event)">

コードは私にエラーを与えます:

プロパティ「値」はタイプ「EventTarget」に存在しません。

しかし、それからわか​​るように、console.logその値はに存在しますevent.target


2
(e.target as HTMLInputElement)
.value

回答:


146

event.targetここにあるHTMLElementすべてのHTML要素の親であるが、プロパティを持つことが保証されていませんvalue。TypeScriptはこれを検出し、エラーをスローします。event.target適切なHTML要素にキャストHTMLInputElementして、valueプロパティがあることを確認します。

(<HTMLInputElement>event.target).value

ドキュメントごと:

入力します $event

上記の例では、$eventany型としてキャストしています。これはコストをかけてコードを単純化します。イベントオブジェクトのプロパティを明らかにし、愚かな間違いを防ぐことができるタイプ情報はありません。

[...]

これ$eventは特定のものKeyboardEventです。すべての要素にvalueプロパティがあるわけではないためtarget、入力要素にキャストします。

(エンファシス鉱山)


26
少しvar element = ev.target as HTMLElement
すっきりした

私にとって、HTMLElementはインターフェイスに値がないため、HTMLElementではなくHTMLInputElementが機能しました。
Harsha Vardhini

私の意見では、最良のアプローチonFieldUpdate(event: { target: HTMLInputElement }) {は、呼び出された関数を使用することです。以下の私の答えを参照してください。
ベルベデレフ

Angular 9の場合は、 "as"構文を使用します。event.target as HtmlInputlement
Prescol

86

HTMLInputElementをジェネリックとしてイベントタイプに渡すこともできます。

onUpdatingServerName(event: React.ChangeEvent<HTMLInputElement>) {
  console.log(event);
  this.newserverName = event.target.value;
}

14
これは型アサーションよりも優れています。
JamesYin

2
関数がonChangeReactコードのプロパティハンドラ参照から呼び出された場合、これは機能しません。反応ハンドラは、タイプがReact.ChangeEventに設定されることを想定していないため、入力エラーが表示されます。代わりに、キャストを使用して、選択した回答(の変形)に戻す必要がありました(event.target as HTMLInputElement).value
Spiralis

これは、Reactコンポーネントでうまく機能するように見えました。多分それはReactのバージョンですか?現在16.8。*です。
ヘラタン

49

ここで私のために働く別の修正があります:

(event.target as HTMLInputElement).value

これは、TSは、それは知っているさせることでエラーを取り除く必要がありますevent.targetされHTMLInputElement、本質的に持っています、value。指定する前に、TSは、おそらく唯一のことは知っていたevent人だったHTMLInputElementので、TSによると、キー入力されたtargetものかもしれない、いくつかのランダムなマッピング値でした。


4
これは、<HTMLInputElement>をJSXとして解釈しようとしたReactで非常に役立ちました。
クリストファーブラッドショー

やあ男、共有してくれてありがとう!このソリューションは私に適しています。
Carlos Querioz

16

Reactでの同様のTypeScriptエラーの解決策を探していました。

TypeScriptのタイプEventTargetにプロパティ 'dataset'が存在しません

event.target.datasetReactでクリックされたボタン要素を取得したいと思いました。

<button
  onClick={onClickHandler}
  data-index="4"
  data-name="Foo Bar"
>
  Delete Candidate
</button>

datasetTypeScriptを使用して値を「存在」させる方法は次のとおりです。

const onClickHandler = (event: React.MouseEvent<HTMLButtonElement>) => {
  const { name, index } = (event.target as HTMLButtonElement).dataset
  console.log({ name, index })
  // do stuff with name and index…
}

1
質問にはAngularのタグが付けられているため、Reactの回答はトピックから外れているようです。
John Snow、

2
とにかく…それは複数の賛成票を持っているので、この答えは他の人に役に立ちました。
Beau Smith、

1
魅力のように機能します。onChange={(event: ChangeEvent<HTMLInputElement>): void => { setTextFilter(event.target.value); }}
Vadorequest

2

event.target.value見えない場合は、onChangeハンドラでpropを使用する必要があります。

index.js:1437 Warning: Failed prop type: You provided a `value` prop to a form field without an `onChange` handler. This will render a read-only field. If the field should be mutable use `defaultValue`. Otherwise, set either `onChange` or `readOnly`.

または、onChange以外のハンドラを使用する場合は、 event.currentTarget.value


これは私にとってevent.currentTarget.valueはうまくいきますが、使用するのが最善の方法かどうかはわかりません。
dczii

2

私が行う方法は次のとおりです(タイプアサーションimhoより優れています)。

onFieldUpdate(event: { target: HTMLInputElement }) {
  this.$emit('onFieldUpdate', event.target.value);
}

これtargetは、最も一般的なケースであるプロパティのみに関心があることを前提としています。の他のプロパティにアクセスする必要がある場合event、より包括的なソリューションには、&タイプ交差演算子の使用が含まれます。

event: Event & { target: HTMLInputElement }

これはVue.jsバージョンですが、コンセプトはすべてのフレームワークに適用されます。明らかに、より具体的にHTMLInputElementすることができ、一般的なものを使用する代わりに、たとえばHTMLTextAreaElementテキストエリアに使用できます。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.