Vous devez indiquer explicitement à TypeScript le type de HTMLElement qui est votre cible.
La façon de le faire consiste à utiliser un type générique pour le convertir en un type approprié:
this.countUpdate.emit((<HTMLTextAreaElement>e.target).value./*...*/)
ou (comme vous le souhaitez)
this.countUpdate.emit((e.target as HTMLTextAreaElement).value./*...*/)
ou (encore une fois, question de préférence)
const target = e.target as HTMLTextAreaElement;
this.countUpdate.emit(target.value./*...*/)
Cela permettra à TypeScript de savoir que l'élément est a textarea
et de connaître la propriété value.
La même chose pourrait être faite avec n'importe quel type d'élément HTML, chaque fois que vous donnez à TypeScript un peu plus d'informations sur leurs types, cela vous paie avec des conseils appropriés et bien sûr moins d'erreurs.
Pour vous faciliter la tâche dans le futur, vous souhaiterez peut-être définir directement un événement avec le type de sa cible:
// 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)">
Component:... this.url = event.target.result;
Parfois, ça marche parfois pas, quand ce n'est pas une erreur,error TS2339: Property 'result' does not exist on type 'EventTarget'
comme vous l'avez suggéré, dites-en plus à TS, à l'endroit oùHTMLTextAreaElement
j'ai essayé,HTMLInputElement
alorstarget.value
plus err mais l'image ne s'affiche pas.Event
type. Vous devriez vraiment pouvoir utiliserEvent<HTMLInputElement>
comme type.target
,currentTarget
etsrcElement
; il faudrait taper 3 types génériques; même s'ils utilisent des types par défaut, par exempleEvent<T = any, C = any, S = any>
pour ce qui est mentionné ci-dessus, il pourrait être plus inconfortable à utiliser que l'as
instruction simple . Je pourrais aussi imaginer une guerre sacrée potentielle pour ce qui devrait être d'abord générique:target
oucurrentTarget
. De plus, de nombreuses bibliothèques abusent des événements HTML et peuvent potentiellement mettre tout ce qu'elles veulent dans les propriétés mentionnées. Ce sont probablement les raisons pour lesquelles ils ne l'ont pas fait en tant que génériques(ionChangeEvent.target as HTMLIonInputElement).value as string
Voici l'approche simple que j'ai utilisée:
L'erreur affichée par le compilateur TypeScript a disparu et le code fonctionne.
la source
Peut-être que quelque chose comme ce qui précède pourrait vous aider. Changez-le en fonction du vrai code. Le problème est ........ target ['value']
la source
Je pense que cela doit fonctionner, mais je ne suis pas en mesure d'identifier de toute façon. Une autre approche peut être,
la source
Voici une autre approche simple, que j'ai utilisée;
la source
Depuis que j'ai atteint deux questions recherchant mon problème d'une manière légèrement différente, je réplique ma réponse au cas où vous vous retrouveriez ici.
Dans la fonction appelée, vous pouvez définir votre type avec:
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:Vous pouvez également aller plus spécifique et au lieu d'utiliser,
HTMLInputElement
vous pouvez utiliser par exempleHTMLTextAreaElement
pour les zones de texte.la source
Voici une autre façon de spécifier
event.target
:la source