Więc poniższy kod jest w Angular 4 i nie mogę zrozumieć, dlaczego nie działa tak, jak oczekiwano.
Oto fragment mojego programu obsługi:
onUpdatingServerName(event: Event) {
console.log(event);
this.newserverName = event.target.value; //this wont work
}
Element HTML:
<input type="text" class="form-control" (input)="onUpdatingServerName($event)">
Kod daje mi błąd:
Właściwość „wartość” nie istnieje w typie „EventTarget”.
Ale jak widać w console.log
tej wartości istnieje na event.target
.
Odpowiedzi:
event.target
tutaj jest,HTMLElement
który jest rodzicem wszystkich elementów HTML, ale nie ma gwarancji, że będzie miał właściwośćvalue
. TypeScript wykrywa to i zgłasza błąd. Odlewanieevent.target
do odpowiedniego elementu HTML, aby zapewnić toHTMLInputElement
, które mavalue
właściwość:Zgodnie z dokumentacją :
(Podkreślenie moje)
źródło
var element = ev.target as HTMLElement
onFieldUpdate(event: { target: HTMLInputElement }) {
funkcji wywoływanej. Zobacz moją odpowiedź poniżej.event.target as HtmlInputlement
Przekazywanie elementu HTMLInputElement jako generycznego do typu zdarzenia również powinno działać:
źródło
onChange
odwołania do obsługi proeperty w kodzie React. Procedura obsługi reakcji nie oczekuje, że typ zostanie ustawiony dla zdarzenia React.ChangeEvent i wyświetli błąd wpisywania. Musiałem wrócić do (wariantu) wybraną odpowiedź zamiast z obsadą:(event.target as HTMLInputElement).value
.Oto kolejna poprawka, która działa dla mnie:
(event.target as HTMLInputElement).value
Powinno to wyeliminować błąd, informując TS, że
event.target
jest toHTMLInputElement
, który z natury ma rozszerzenievalue
. Przed określeniem TS prawdopodobnie wiedział tylko, żeevent
sam był anHTMLInputElement
, więc zgodnie z TS wpisanatarget
była jakaś losowo zmapowana wartość, która może być dowolną wartością.źródło
Szukałem rozwiązania podobnego błędu TypeScript w React:
Chciałem dostać się do
event.target.dataset
elementu klikniętego przycisku w Reakcie:Oto, w jaki sposób udało mi się uzyskać
dataset
wartość „istnieje” za pomocą języka TypeScript:źródło
onChange={(event: ChangeEvent<HTMLInputElement>): void => { setTextFilter(event.target.value); }}
Sposób, w jaki to robię, jest następujący (lepszy niż asercja typu imho):
Zakłada się, że interesuje Cię tylko
target
nieruchomość, co jest najczęstszym przypadkiem. Jeśli chcesz uzyskać dostęp do innych właściwości programuevent
, bardziej kompleksowe rozwiązanie obejmuje użycie&
operatora przecięcia typu:To jest wersja Vue.js, ale koncepcja dotyczy wszystkich frameworków. Oczywiście możesz pójść bardziej szczegółowo i zamiast używać generała
HTMLInputElement
, możesz użyć np.HTMLTextAreaElement
Dla obszarów tekstowych.źródło
Powinieneś użyć
event.target.value
prop z obsługą onChange, jeśli nie widzisz:Lub jeśli chcesz użyć innej procedury obsługi niż onChange, użyj
event.currentTarget.value
źródło
event.currentTarget.value
jest to najlepsze podejście.