Debe indicar explícitamente a TypeScript el tipo de HTMLElement que es su objetivo.
La forma de hacerlo es usar un tipo genérico para convertirlo en un tipo adecuado:
this.countUpdate.emit((<HTMLTextAreaElement>e.target).value./*...*/)
o (como quieras)
this.countUpdate.emit((e.target as HTMLTextAreaElement).value./*...*/)
o (de nuevo, cuestión de preferencia)
const target = e.target as HTMLTextAreaElement;
this.countUpdate.emit(target.value./*...*/)
Esto le permitirá a TypeScript saber que el elemento es un textarea
y conocerá la propiedad value.
Lo mismo se puede hacer con cualquier tipo de elemento HTML, siempre que le brinde a TypeScript un poco más de información sobre sus tipos, se lo devolverá con las sugerencias adecuadas y, por supuesto, con menos errores.
Para que sea más fácil para el futuro, es posible que desee definir directamente un evento con el tipo de su objetivo:
// create a new type HTMLElementEvent that has a target of type you pass
// type T must be a HTMLElement (e.g. HTMLTextAreaElement extends HTMLElement)
type HTMLElementEvent<T extends HTMLElement> = Event & {
target: T;
// probably you might want to add the currentTarget as well
// currentTarget: T;
}
// use it instead of Event
let e: HTMLElementEvent<HTMLTextAreaElement>;
console.log(e.target.value);
// or in the context of the given example
emitWordCount(e: HTMLElementEvent<HTMLTextAreaElement>) {
this.countUpdate.emit(e.target.value);
}
<img [src]="url"> <br/> <input type='file' (change)="showImg($event)">
Componente:... this.url = event.target.result;
A veces funciona, a veces no, cuando no es err eserror TS2339: Property 'result' does not exist on type 'EventTarget'
Como sugirió, dígale a TS más al respecto, en el lugarHTMLTextAreaElement
que probé,HTMLInputElement
entoncestarget.value
no más err pero la imagen no se muestra.Event
. Realmente debería poder usarloEvent<HTMLInputElement>
como tipo.target
,currentTarget
ysrcElement
; habría que escribir 3 tipos genéricos; incluso si usan tipos predeterminados, por ejemplo,Event<T = any, C = any, S = any>
para lo mencionado anteriormente, podría ser más incómodo de usar que la simpleas
declaración. También podría imaginar una posible guerra santa para lo que debería ser primero genérico:target
ocurrentTarget
. Además, muchas bibliotecas abusan del evento HTML y potencialmente pueden poner lo que quieran en las propiedades mencionadas. Probablemente estas son las razones por las que no lo hicieron como genéricos(ionChangeEvent.target as HTMLIonInputElement).value as string
Aquí está el enfoque simple que utilicé:
El error mostrado por el compilador de TypeScript desapareció y el código funciona.
fuente
Quizás algo como lo anterior podría ayudar. Cámbielo según el código real. El problema es ........ objetivo ['valor']
fuente
Creo que debe funcionar, pero no puedo identificar de ninguna manera. Otro enfoque puede ser,
fuente
Aquí hay otro enfoque simple que utilicé;
fuente
Como llegué a dos preguntas buscando mi problema de una manera ligeramente diferente, estoy replicando mi respuesta en caso de que termines aquí.
En la función llamada, puede definir su tipo con:
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:También puede ser más específico y, en lugar de usar
HTMLInputElement
, puede usar, por ejemplo,HTMLTextAreaElement
para áreas de texto.fuente
Aquí hay una forma más de especificar
event.target
:fuente