Вам необходимо явно указать TypeScript тип HTMLElement, который является вашей целью.
Способ сделать это - использовать общий тип, чтобы привести его к правильному типу:
this.countUpdate.emit((<HTMLTextAreaElement>e.target).value./*...*/)
или (как угодно)
this.countUpdate.emit((e.target as HTMLTextAreaElement).value./*...*/)
или (опять же, вопрос предпочтения)
const target = e.target as HTMLTextAreaElement;
this.countUpdate.emit(target.value./*...*/)
Это позволит TypeScript узнать, что это элемент, textarea
и узнать о свойстве value.
То же самое можно сделать с любым типом HTML-элемента: всякий раз, когда вы даете TypeScript немного больше информации об их типах, он окупается правильными подсказками и, конечно же, меньшим количеством ошибок.
Чтобы упростить задачу в будущем, вы можете напрямую определить событие с типом его цели:
// 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)">
Компонент:... this.url = event.target.result;
Когда - нибудь не работает , иногда нет, когда это не свойственно ошибаться ,error TS2339: Property 'result' does not exist on type 'EventTarget'
как вы предложили рассказать TS больше об этом, в том месте ,HTMLTextAreaElement
я пыталсяHTMLInputElement
тогдаtarget.value
не более ошибка, но изображение не отображается.Event
тип. Вы действительно должны уметь использоватьEvent<HTMLInputElement>
как тип.target
,currentTarget
иsrcElement
; нужно ввести 3 универсальных типа; даже если они используют типы по умолчанию, например,Event<T = any, C = any, S = any>
для упомянутых выше, это может быть более неудобно, чем простойas
оператор. Я также мог вообразить потенциальный холивар для того, что должно быть первым родовым:target
илиcurrentTarget
. Кроме того, многие библиотеки злоупотребляют HTML-событиями и потенциально могут поместить все, что захотят, в упомянутые свойства. Вероятно, это причины, по которым они не сделали это как встроенные дженерики(ionChangeEvent.target as HTMLIonInputElement).value as string
Вот простой подход, который я использовал:
Ошибка, отображаемая компилятором TypeScript, исчезла, и код работает.
источник
Может быть, поможет что-то подобное. Измените его на основе реального кода. Проблема в том ........ цель ['значение']
источник
Я считаю, что это должно сработать, но никакие способы я не могу определить. Другой подход может быть,
источник
Вот еще один простой подход, который я использовал;
источник
Поскольку я ответил на два вопроса, пытаясь найти свою проблему немного по-другому, я повторяю свой ответ на случай, если вы окажетесь здесь.
В вызываемой функции вы можете определить свой тип с помощью:
Это предполагает, что вас интересует только
target
собственность, что является наиболее распространенным случаем. Если вам нужно получить доступ к другим свойствамevent
, более комплексное решение включает использование&
оператора пересечения типов:Вы также можете сделать более конкретным и вместо использования
HTMLInputElement
вы можете использовать, например,HTMLTextAreaElement
для текстовых полей.источник
Вот еще один способ указать
event.target
:источник