Anda perlu memberi tahu TypeScript secara eksplisit jenis HTMLElement yang merupakan target Anda.
Cara melakukannya adalah menggunakan tipe generik untuk mentransmisikannya ke tipe yang tepat:
this.countUpdate.emit((<HTMLTextAreaElement>e.target).value./*...*/)
atau (sesuka Anda)
this.countUpdate.emit((e.target as HTMLTextAreaElement).value./*...*/)
atau (sekali lagi, masalah preferensi)
const target = e.target as HTMLTextAreaElement;
this.countUpdate.emit(target.value./*...*/)
Ini akan memberi tahu TypeScript bahwa elemennya adalah a textarea
dan akan mengetahui properti nilai.
Hal yang sama dapat dilakukan dengan semua jenis elemen HTML, setiap kali Anda memberikan TypeScript sedikit lebih banyak informasi tentang jenisnya, Anda akan terbalas dengan petunjuk yang tepat dan tentu saja lebih sedikit kesalahan.
Untuk mempermudah masa depan, Anda mungkin ingin menentukan acara secara langsung dengan jenis targetnya:
// 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)">
Komponen:... this.url = event.target.result;
Kadang-kadang berfungsi kadang tidak, ketika tidak salah adalaherror TS2339: Property 'result' does not exist on type 'EventTarget'
Seperti yang Anda sarankan, beri tahu TS lebih lanjut tentang hal itu, di tempatHTMLTextAreaElement
saya mencobaHTMLInputElement
makatarget.value
tidak lagi err tapi gambar tidak ditampilkan.Event
tipe. Anda harus benar-benar dapat menggunakanEvent<HTMLInputElement>
sebagai tipe.target
,currentTarget
dansrcElement
; seseorang perlu mengetikkan 3 tipe generik; bahkan jika mereka menggunakan tipe default misalnyaEvent<T = any, C = any, S = any>
untuk yang disebutkan di atas, ini bisa jadi lebih tidak nyaman digunakan daripadaas
pernyataan sederhana . Saya juga bisa membayangkan perang suci potensial untuk apa yang seharusnya menjadi generik pertama:target
ataucurrentTarget
. Selain itu, banyak perpustakaan menyalahgunakan acara HTML dan berpotensi menempatkan apa pun yang mereka inginkan di properti yang disebutkan. Mungkin ini adalah alasan mengapa mereka tidak melakukannya sebagai obat generik(ionChangeEvent.target as HTMLIonInputElement).value as string
Inilah pendekatan sederhana yang saya gunakan:
Kesalahan yang ditunjukkan oleh compiler TypeScript hilang dan kode berfungsi.
sumber
Mungkin hal seperti di atas bisa membantu. Ubah berdasarkan kode yang sebenarnya. Masalahnya adalah ........ target ['value']
sumber
Saya percaya itu harus berhasil tetapi dengan cara apa pun saya tidak dapat mengidentifikasi. Pendekatan lain bisa jadi,
sumber
Ini adalah pendekatan sederhana lainnya, yang saya gunakan;
sumber
Karena saya mencapai dua pertanyaan untuk mencari masalah saya dengan cara yang sedikit berbeda, saya mengulangi jawaban saya jika Anda berakhir di sini.
Dalam fungsi yang dipanggil, Anda dapat menentukan tipe Anda dengan:
Ini mengasumsikan Anda hanya tertarik pada
target
properti, yang merupakan kasus paling umum. Jika Anda perlu mengakses properti lain darievent
, solusi yang lebih komprehensif melibatkan penggunaan&
operator persimpangan tipe:Anda juga bisa lebih spesifik dan daripada menggunakan
HTMLInputElement
Anda bisa menggunakan misalnyaHTMLTextAreaElement
untuk textareas.sumber
Berikut satu cara lagi untuk menentukan
event.target
:sumber