Sie müssen TypeScript explizit den Typ des HTMLElement mitteilen, das Ihr Ziel ist.
Der Weg, dies zu tun, besteht darin, einen generischen Typ zu verwenden, um ihn in einen richtigen Typ umzuwandeln:
this.countUpdate.emit((<HTMLTextAreaElement>e.target).value./*...*/)
oder (wie du willst)
this.countUpdate.emit((e.target as HTMLTextAreaElement).value./*...*/)
oder (wieder eine Frage der Präferenz)
const target = e.target as HTMLTextAreaElement;
this.countUpdate.emit(target.value./*...*/)
Dadurch wird TypeScript darüber informiert, dass das Element a ist, textarea
und es wird die value-Eigenschaft bekannt.
Dasselbe kann mit jeder Art von HTML-Element gemacht werden. Wenn Sie TypeScript ein bisschen mehr Informationen über ihre Typen geben, werden Sie mit den richtigen Hinweisen und natürlich weniger Fehlern zurückgezahlt.
Um es für die Zukunft einfacher zu machen, möchten Sie möglicherweise ein Ereignis direkt mit dem Typ seines Ziels definieren:
// 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)">
Komponente:... this.url = event.target.result;
Manchmal funktioniert es manchmal nicht, wenn es nicht fehlerhaft ist.error TS2339: Property 'result' does not exist on type 'EventTarget'
Wie Sie vorgeschlagen haben, erzählen Sie TS mehr darüber, an der Stelle, an derHTMLTextAreaElement
ich es versucht habe,HTMLInputElement
danntarget.value
nicht mehr Fehler, aber das Bild wird nicht angezeigt.Event
Typ übergeben konnten. Sie sollten wirklich in der Lage sein,Event<HTMLInputElement>
als Typ zu verwenden.target
,currentTarget
undsrcElement
; man müsste 3 generische Typen eingeben; Selbst wenn sie Standardtypen verwenden, z. B.Event<T = any, C = any, S = any>
für die oben genannten, kann die Verwendung unangenehmer sein als die einfacheas
Anweisung. Ich könnte mir auch einen möglichen Holywar für das vorstellen, was zuerst generisch sein sollte:target
odercurrentTarget
. Darüber hinaus missbrauchen viele Bibliotheken HTML-Ereignisse und können möglicherweise alles, was sie wollen, in die genannten Eigenschaften einfügen. Wahrscheinlich sind dies die Gründe, warum sie es nicht als eingebaute Generika(ionChangeEvent.target as HTMLIonInputElement).value as string
Hier ist der einfache Ansatz, den ich verwendet habe:
Der vom TypeScript-Compiler angezeigte Fehler ist verschwunden und der Code funktioniert.
quelle
Vielleicht könnte so etwas helfen. Ändern Sie es basierend auf dem realen Code. Das Problem ist ........ Ziel ['Wert']
quelle
Ich glaube, es muss funktionieren, aber ich kann mich nicht identifizieren. Ein anderer Ansatz kann sein:
quelle
Hier ist ein anderer einfacher Ansatz, den ich verwendet habe;
quelle
Da ich zwei Fragen bei der Suche nach meinem Problem auf etwas andere Weise beantwortet habe, wiederhole ich meine Antwort, falls Sie hier landen.
In der aufgerufenen Funktion können Sie Ihren Typ definieren mit:
Dies setzt voraus, dass Sie nur an der
target
Immobilie interessiert sind , was der häufigste Fall ist. Wenn Sie auf die anderen Eigenschaften von zugreifen müssenevent
, besteht eine umfassendere Lösung darin, den&
Typschnittoperator zu verwenden:Sie können auch spezifischer vorgehen und anstatt zu verwenden
HTMLInputElement
, können Sie zBHTMLTextAreaElement
für Textbereiche verwenden.quelle
Hier ist eine weitere Möglichkeit, Folgendes anzugeben
event.target
:quelle