Portanto, o código a seguir está em Angular 4 e não consigo descobrir por que ele não funciona da maneira esperada.
Aqui está um snippet do meu manipulador:
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)">
O código me dá o erro:
A propriedade 'valor' não existe no tipo 'EventTarget'.
Mas, como pode ser visto no, console.log
esse valor existe no event.target
.
javascript
angular
typescript
Ravy
fonte
fonte
Respostas:
event.target
aqui está umHTMLElement
que é o pai de todos os elementos HTML, mas não é garantido que tenha a propriedadevalue
. O TypeScript detecta isso e gera o erro. Transmitaevent.target
para o elemento HTML apropriado para garantirHTMLInputElement
que ele tenha umavalue
propriedade:Pela documentação :
(Ênfase minha)
fonte
var element = ev.target as HTMLElement
onFieldUpdate(event: { target: HTMLInputElement }) {
na função chamada. Veja minha resposta abaixo.event.target as HtmlInputlement
Passar HTMLInputElement como um genérico para o tipo de evento também deve funcionar:
fonte
onChange
referência de manipulador de propriedade no código React. O manipulador de reação não espera que o tipo seja definido para React.ChangeEvent e mostrará um erro de digitação. I teve de voltar a (uma variante de) a resposta seleccionada em vez disso, com um molde:(event.target as HTMLInputElement).value
.Aqui está outra correção que funciona para mim:
(event.target as HTMLInputElement).value
Isso deve eliminar o erro, informando ao TS que
event.target
é umHTMLInputElement
, que inerentemente tem umvalue
. Antes de especificar, o TS provavelmente só sabia queevent
sozinho era umHTMLInputElement
, portanto, de acordo com o TS, o valor digitadotarget
era algum valor mapeado aleatoriamente que poderia ser qualquer coisa.fonte
Eu estava procurando uma solução para um erro semelhante do TypeScript com React:
Eu queria chegar a
event.target.dataset
um elemento de botão clicado no React:Aqui está como eu consegui fazer o
dataset
valor "existir" via TypeScript:fonte
onChange={(event: ChangeEvent<HTMLInputElement>): void => { setTextFilter(event.target.value); }}
A maneira como faço isso é a seguinte (melhor do que digitar assertion imho):
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:Esta é uma versão Vue.js, mas o conceito se aplica a todos os frameworks. Obviamente, você pode ir mais específico e em vez de usar um geral,
HTMLInputElement
você pode usar, por exemplo,HTMLTextAreaElement
para áreas de texto.fonte
Você deve usar
event.target.value
prop com o manipulador onChange, caso não consiga ver:Ou se você quiser usar outro manipulador que não seja onChange, use
event.currentTarget.value
fonte
event.currentTarget.value
é a melhor abordagem.