Entonces, el siguiente código está en Angular 4 y no puedo entender por qué no funciona como se esperaba.
Aquí hay un fragmento de mi controlador:
onUpdatingServerName(event: Event) {
console.log(event);
this.newserverName = event.target.value; //this wont work
}
Elemento HTML:
<input type="text" class="form-control" (input)="onUpdatingServerName($event)">
El código me da el error:
La propiedad 'valor' no existe en el tipo 'EventTarget'.
Pero como se puede ver en el, console.log
ese valor existe en el event.target
.
Respuestas:
event.target
aquí hay unHTMLElement
que es el padre de todos los elementos HTML, pero no se garantiza que tenga la propiedadvalue
. TypeScript detecta esto y arroja el error. Transmitirevent.target
al elemento HTML apropiado para asegurarse de que sea elHTMLInputElement
que tenga unavalue
propiedad:Según la documentación :
(El énfasis es mío)
fuente
var element = ev.target as HTMLElement
onFieldUpdate(event: { target: HTMLInputElement }) {
en la función llamada. Vea mi respuesta a continuación.event.target as HtmlInputlement
Pasar HTMLInputElement como genérico al tipo de evento también debería funcionar:
fuente
onChange
embargo, esto no funcionará si se llama a la función desde, por ejemplo, una referencia de controlador de propiedad en el código de React. El controlador de reacción no espera que el tipo se establezca para React.ChangeEvent y mostrará un error de escritura. Tenía que volver a (una variante de) la respuesta seleccionada por el contrario, con un reparto:(event.target as HTMLInputElement).value
.Aquí hay otra solución que funciona para mí:
(event.target as HTMLInputElement).value
Eso debería eliminar el error al hacerle saber a TS que
event.target
es unHTMLInputElement
, que inherentemente tiene unvalue
. Antes de especificar, TS probablemente solo sabía queevent
solo era unHTMLInputElement
, por lo tanto, según TS, el tecleadotarget
era un valor mapeado aleatoriamente que podría ser cualquier cosa.fuente
Estaba buscando una solución a un error similar de TypeScript con React:
Quería llegar a
event.target.dataset
un elemento de botón en el que se hizo clic en React:Así es como pude obtener el
dataset
valor para "existir" a través de TypeScript:fuente
onChange={(event: ChangeEvent<HTMLInputElement>): void => { setTextFilter(event.target.value); }}
Debería usar
event.target.value
prop con el controlador onChange si no puede ver:O si desea utilizar otro controlador que no sea onChange, utilice
event.currentTarget.value
fuente
event.currentTarget.value
sea el mejor enfoque.La forma en que lo hago es la siguiente (mejor que la afirmación de tipo en mi humilde opinión):
Esto supone que solo está interesado en la
target
propiedad, que es el caso más común. Si necesita acceder a las otras propiedades deevent
, una solución más completa implica el uso del&
operador de intersección de tipo:Esta es una versión de Vue.js, pero el concepto se aplica a todos los marcos. Obviamente, puede ir más específico y en lugar de usar un general
HTMLInputElement
puede usar, por ejemplo,HTMLTextAreaElement
para áreas de texto.fuente