Musisz jawnie podać TypeScript typ elementu HTMLElement, który jest Twoim celem.
Aby to zrobić, użyj typu ogólnego, aby rzutować go na właściwy typ:
this.countUpdate.emit((<HTMLTextAreaElement>e.target).value./*...*/)
lub (jak chcesz)
this.countUpdate.emit((e.target as HTMLTextAreaElement).value./*...*/)
lub (znowu, kwestia preferencji)
const target = e.target as HTMLTextAreaElement;
this.countUpdate.emit(target.value./*...*/)
Dzięki temu TypeScript będzie wiedział, że element jest plikiem textarea
i będzie wiedział o właściwości value.
To samo można zrobić z każdym rodzajem elementu HTML, ilekroć podasz TypeScript nieco więcej informacji o ich typach, odwdzięczy się to odpowiednimi wskazówkami i oczywiście mniejszą liczbą błędów.
Aby ułatwić sobie na przyszłość, możesz chcieć bezpośrednio zdefiniować zdarzenie z typem jego celu:
// 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)">
Składnik:... this.url = event.target.result;
Czasami działa czasami nie, jeśli nie jest to błąderror TS2339: Property 'result' does not exist on type 'EventTarget'
Tak jak zasugerowałeś, powiedz TS więcej o tym, w miejscu,HTMLTextAreaElement
które próbowałem,HTMLInputElement
a potemtarget.value
nie więcej err, ale obraz się nie wyświetla.Event
czcionki. Naprawdę powinieneś być w stanie użyćEvent<HTMLInputElement>
jako typu.target
,currentTarget
isrcElement
; należałoby wpisać 3 typy ogólne; nawet jeśli używają domyślnych typów, np.Event<T = any, C = any, S = any>
dla wyżej wymienionych, może być bardziej niewygodne w użyciu niż prosteas
stwierdzenie. Mogę również wyobrazić sobie potencjalny holywar dla tego, co powinno być najpierw ogólne:target
lubcurrentTarget
. Ponadto wiele bibliotek nadużywa zdarzenia HTML i może potencjalnie umieścić wszystko, czego chcą, we wspomnianych właściwościach. Prawdopodobnie są to powody, dla których nie zrobili tego jako wbudowane(ionChangeEvent.target as HTMLIonInputElement).value as string
Oto proste podejście, którego użyłem:
Błąd wyświetlany przez kompilator TypeScript zniknął i kod działa.
źródło
Może coś takiego jak powyższe mogłoby pomóc. Zmień to w oparciu o rzeczywisty kod. Problem jest ........ target ['value']
źródło
Uważam, że to musi działać, ale nie mogę zidentyfikować żadnych sposobów. Innym podejściem może być:
źródło
Oto inne proste podejście, którego użyłem;
źródło
Ponieważ dotarłem do dwóch pytań, szukając mojego problemu w nieco inny sposób, powtarzam swoją odpowiedź na wypadek, gdybyś tu znalazł się.
W wywołanej funkcji możesz zdefiniować swój typ za pomocą:
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:Możesz również przejść bardziej szczegółowo i zamiast
HTMLInputElement
używać, na przykład,HTMLTextAreaElement
dla obszarów tekstowych.źródło
Oto jeszcze jeden sposób określenia
event.target
:źródło