Итак, следующий код находится в Angular 4, и я не могу понять, почему он работает не так, как ожидалось.
Вот фрагмент моего обработчика:
onUpdatingServerName(event: Event) {
console.log(event);
this.newserverName = event.target.value; //this wont work
}
HTML-элемент:
<input type="text" class="form-control" (input)="onUpdatingServerName($event)">
Код дает мне ошибку:
Свойство value не существует для типа EventTarget.
Но, как видно на рисунке, console.log
это значение существует в event.target
.
Ответы:
event.target
вотHTMLElement
родительский элемент всех HTML-элементов, но не гарантируется наличие свойстваvalue
. TypeScript обнаруживает это и выдает ошибку. Приведитеevent.target
к соответствующему элементу HTML, чтобы убедиться,HTMLInputElement
что у него естьvalue
свойство:Согласно документации :
(Акцент мой)
источник
var element = ev.target as HTMLElement
onFieldUpdate(event: { target: HTMLInputElement }) {
в вызываемой функции. Смотрите мой ответ ниже.event.target as HtmlInputlement
Передача HTMLInputElement в качестве универсального для типа события также должна работать:
источник
onChange
ссылки обработчика свойства в коде React. Обработчик реакции не ожидает, что тип будет установлен для React.ChangeEvent, и покажет ошибку ввода. Я должен был вернуться к (вариант) выбранного ответа вместо с броском:(event.target as HTMLInputElement).value
.Вот еще одно исправление, которое мне подходит:
(event.target as HTMLInputElement).value
Это должно избавить от ошибки, сообщив TS, что
event.target
это файлHTMLInputElement
, который по своей сути имеет расширениеvalue
. Перед указанием TS, вероятно, знала только, что этоevent
одноHTMLInputElement
, поэтому, согласно TS, введенное значениеtarget
было некоторым случайно отображенным значением, которое могло быть чем угодно.источник
Я искал решение аналогичной ошибки TypeScript с React:
Я хотел добраться до
event.target.dataset
элемента с нажатой кнопкой в React:Вот как я смог заставить
dataset
значение «существовать» через TypeScript:источник
onChange={(event: ChangeEvent<HTMLInputElement>): void => { setTextFilter(event.target.value); }}
Я делаю это следующим образом (лучше, чем утверждение типа imho):
Это предполагает, что вас интересует только
target
собственность, что является наиболее распространенным случаем. Если вам нужно получить доступ к другим свойствамevent
, более комплексное решение включает использование&
оператора пересечения типов:Это версия Vue.js, но концепция применима ко всем фреймворкам. Очевидно, вы можете пойти более конкретным образом и вместо общего
HTMLInputElement
использования, например,HTMLTextAreaElement
для текстовых полей.источник
Вы должны использовать
event.target.value
опору с обработчиком onChange, если вы не видите:Или, если вы хотите использовать другой обработчик, кроме onChange, используйте
event.currentTarget.value
источник
event.currentTarget.value
это лучший подход.добавить к событию любой тип
пример
источник