Você precisa informar explicitamente ao TypeScript o tipo de HTMLElement que é seu destino.
A maneira de fazer isso é usar um tipo genérico para convertê-lo em um tipo adequado:
this.countUpdate.emit((<HTMLTextAreaElement>e.target).value./*...*/)
ou (como você quiser)
this.countUpdate.emit((e.target as HTMLTextAreaElement).value./*...*/)
ou (novamente, questão de preferência)
const target = e.target as HTMLTextAreaElement;
this.countUpdate.emit(target.value./*...*/)
Isso permitirá ao TypeScript saber que o elemento é um textarea
e saberá da propriedade value.
O mesmo poderia ser feito com qualquer tipo de elemento HTML, sempre que você fornecer ao TypeScript um pouco mais de informação sobre seus tipos, ele retribuirá com dicas adequadas e, claro, menos erros.
Para tornar mais fácil para o futuro, você pode definir diretamente um evento com o tipo de seu destino:
// 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;
Algum funciona, às vezes não, quando não err está éerror TS2339: Property 'result' does not exist on type 'EventTarget'
como você sugeriu TS dizer mais sobre isso, no lugarHTMLTextAreaElement
eu tenteiHTMLInputElement
, em seguida,target.value
não mais errar, mas a imagem não está sendo exibida.Event
tipo. Você realmente deve ser capaz de usarEvent<HTMLInputElement>
como um tipo.target
,currentTarget
esrcElement
; seria necessário digitar 3 tipos genéricos; mesmo se eles usarem tipos padrão, por exemplo,Event<T = any, C = any, S = any>
para o mencionado acima, pode ser mais desconfortável de usar do que aas
instrução simples . Eu também poderia imaginar uma guerra sagrada potencial para o que deveria ser primeiro genérico:target
oucurrentTarget
. Além disso, muitas bibliotecas abusam de eventos HTML e podem potencialmente colocar o que quiserem nas propriedades mencionadas. Provavelmente essas são as razões pelas quais eles não o fizeram como genéricos(ionChangeEvent.target as HTMLIonInputElement).value as string
Aqui está a abordagem simples que usei:
O erro mostrado pelo compilador TypeScript desapareceu e o código funciona.
fonte
Talvez algo como o acima possa ajudar. Altere-o com base no código real. O problema é ........ alvo ['valor']
fonte
Eu acredito que deve funcionar, mas de alguma forma não sou capaz de identificar. Outra abordagem pode ser,
fonte
Aqui está outra abordagem simples, eu usei;
fonte
Como cheguei a duas questões buscando meu problema de uma forma ligeiramente diferente, estou replicando minha resposta caso você acabe aqui.
Na função chamada, você pode definir seu tipo com:
Isso pressupõe que você está interessado apenas na
target
propriedade, que é o caso mais comum. Se você precisar acessar as outras propriedades deevent
, uma solução mais abrangente envolve o uso do&
operador de interseção de tipo:Você também pode ser mais específico e, em vez de usar,
HTMLInputElement
pode usar, por exemplo,HTMLTextAreaElement
para áreas de texto.fonte
Aqui está mais uma maneira de especificar
event.target
:fonte