Property 'value' does not exist on type 'EventTarget': Lösung 2025

Online Python-Trainer für Anfänger

Lernen Sie Python einfach ohne theoretische Überlastung. Lösen Sie praktische Aufgaben mit automatischer Überprüfung und schreiben Sie Code direkt im Browser.

Kurs starten

„Property 'value' does not exist on type 'EventTarget'“ – Wie man die Angst verliert und Ereignisse in TypeScript typisiert

\n\n

Haben Sie jemals einen Event-Handler in TypeScript geschrieben, versucht event.target.value zu erhalten – und sofort eine rote Unterstreichung mit der Meldung bekommen: „Property 'value' does not exist on type 'EventTarget'“? Wenn ja, sind Sie nicht allein. Auf Stack Overflow hat diese Frage zehntausende Aufrufe gesammelt und sie quält weiterhin Anfänger und erfahrene Entwickler im Jahr 2025.

\n\n

Das Problem ist nicht, dass TypeScript „böse“ oder „kaputt“ ist. Ganz im Gegenteil: Der Compiler schützt Sie vor dummen Fehlern, die zur Laufzeit auftreten könnten. Lassen Sie uns verstehen, warum dieser Fehler auftritt und wie man ihn richtig behebt.

\n\n

Warum beschwert sich TypeScript über event.target.value?

\n\n

Kurze Antwort: event.target hat den Typ EventTarget | null. Und EventTarget hat keine Eigenschaft value. Es hat nur drei Methoden: addEventListener, removeEventListener und dispatchEvent.

\n\n

Wenn Sie schreiben:

\n\n
const handleChange = (event: React.ChangeEvent) => {\n  const value = event.target.value; // ❌ Fehler!\n};\n
\n\n

Sieht TypeScript: „Hey, ich weiß nicht, welches konkrete HTML-Element dieses Ereignis ausgelöst hat. Vielleicht ist es ein <div>, das kein value hat, oder vielleicht ein <input> – ich bin mir nicht sicher. Daher weigere ich mich, solchen Code zu kompilieren.“

\n\n

Das ist ein Feature, kein Bug. TypeScript zwingt Sie, explizit anzugeben, mit welchem Element Sie arbeiten.

\n\n

Top-3 Lösungswege (aktuell für 2025)

\n\n

Es gibt mehrere Ansätze. Wir betrachten die gängigsten und sichersten.

\n\n

1. Cast mit as HTMLInputElement (schnell, aber vorsichtig)

\n\n

Der gebräuchlichste Weg ist, event.target in den gewünschten Typ zu casten:

\n\n
const handleChange = (event: React.ChangeEvent<HTMLInputElement>) => {\n  const value = (event.target as HTMLInputElement).value;\n  console.log(value);\n};\n
\n\n

Vorteile: einfach, verständlich, funktioniert.

\n

Nachteile: Wenn Sie sich irren und das Ereignis tatsächlich von einem <textarea> oder <select> kommt, erhalten Sie zur Laufzeit undefined. Der Compiler warnt Sie nicht.

\n\n

Verwenden Sie diese Methode am besten, wenn Sie absolut sicher über den Elementtyp sind. Zum Beispiel in einfachen Formularen mit einem einzigen Feld.

\n\n

2. event.currentTarget statt event.target verwenden

\n\n

In TypeScript ist currentTarget strenger typisiert als target. Wenn Sie einen generischen Parameter für das Ereignis angeben, hat currentTarget den korrekten Typ:

\n\n
const handleChange = (event: React.ChangeEvent<HTMLInputElement>) => {\n  const value = event.currentTarget.value; // ✅ Funktioniert ohne Cast!\n};\n
\n\n

Wichtig: currentTarget ist das Element, an das der Handler gebunden ist. Wenn Sie den Handler an ein <input> gebunden haben, ist currentTarget immer dieses <input>. Im Gegensatz zu target, das ein verschachteltes Element sein kann (z.B. ein <span> innerhalb eines Buttons).

\n\n

Vorteile: Sicherer als ein Cast, keine zusätzlichen Typumwandlungen nötig.

\n

Nachteile: Nicht für alle Szenarien geeignet – z.B. bei Event-Bubbling kann currentTarget vom Zielelement abweichen.

\n\n

3. Generische Funktion mit Überprüfung (der sicherste Weg)

\n\n

Wenn Sie maximale Sicherheit und Wiederverwendbarkeit wünschen, schreiben Sie eine Hilfsfunktion, die den Elementtyp überprüft:

\n\n
function getInputValue(event: Event): string                

Blogs

Buchempfehlungen