Donc, le code suivant est dans Angular 4 et je ne peux pas comprendre pourquoi cela ne fonctionne pas comme prévu.
Voici un extrait de mon gestionnaire:
onUpdatingServerName(event: Event) {
console.log(event);
this.newserverName = event.target.value; //this wont work
}
Élément HTML:
<input type="text" class="form-control" (input)="onUpdatingServerName($event)">
Le code me donne l'erreur:
La propriété 'value' n'existe pas sur le type 'EventTarget'.
Mais comme on peut le voir dans le, console.log
cette valeur existe sur le event.target
.
Réponses:
event.target
voici unHTMLElement
qui est le parent de tous les éléments HTML, mais il n'est pas garanti d'avoir la propriétévalue
. TypeScript détecte cela et renvoie l'erreur. Effectuez un castevent.target
vers l'élément HTML approprié pour vous assurer qu'il s'agit bien de celuiHTMLInputElement
qui possède unevalue
propriété:Selon la documentation :
(Je souligne)
la source
var element = ev.target as HTMLElement
onFieldUpdate(event: { target: HTMLInputElement }) {
dans la fonction appelée. Voir ma réponse ci-dessous.event.target as HtmlInputlement
Passer HTMLInputElement en tant que générique au type d'événement devrait également fonctionner:
la source
onChange
référence de gestionnaire de propriété dans le code React. Le gestionnaire de réaction ne s'attend pas à ce que le type soit défini pour React.ChangeEvent et affichera une erreur de frappe. Je devais revenir à (une variante de) la réponse au lieu choisi, avec un casting:(event.target as HTMLInputElement).value
.Voici une autre solution qui fonctionne pour moi:
(event.target as HTMLInputElement).value
Cela devrait éliminer l'erreur en informant TS que
event.target
c'est unHTMLInputElement
, qui a intrinsèquement unvalue
. Avant de spécifier, TS savait probablement queevent
seul était unHTMLInputElement
, donc selon TS la valeur saisietarget
était une valeur mappée au hasard qui pouvait être n'importe quoi.la source
Je cherchais une solution à une erreur TypeScript similaire avec React:
Je voulais accéder à
event.target.dataset
un élément de bouton cliqué dans React:Voici comment j'ai pu obtenir la
dataset
valeur pour "exister" via TypeScript:la source
onChange={(event: ChangeEvent<HTMLInputElement>): void => { setTextFilter(event.target.value); }}
La façon dont je le fais est la suivante (mieux que l'assertion de type à mon humble avis):
Cela suppose que vous n'êtes intéressé que par la
target
propriété, ce qui est le cas le plus courant. Si vous avez besoin d'accéder aux autres propriétés deevent
, une solution plus complète consiste à utiliser l'&
opérateur d'intersection de type:Il s'agit d'une version de Vue.js mais le concept s'applique à tous les frameworks. Évidemment, vous pouvez aller plus spécifique et au lieu d'utiliser un général,
HTMLInputElement
vous pouvez utiliser par exempleHTMLTextAreaElement
pour les zones de texte.la source
Vous devez utiliser
event.target.value
prop avec le gestionnaire onChange sinon vous pouvez voir:Ou si vous souhaitez utiliser un autre gestionnaire que onChange, utilisez
event.currentTarget.value
la source
event.currentTarget.value
soit la meilleure approche.