La propriété 'value' n'existe pas sur le type 'EventTarget' : solution 2025

Formateur Python en ligne pour débutants

Apprenez Python facilement sans surcharge théorique. Résolvez des tâches pratiques avec vérification automatique et écrivez du code directement dans le navigateur.

Start Course

« Property 'value' does not exist on type 'EventTarget' » — comment arrêter d'avoir peur et commencer à typer les événements en TypeScript

\n\n

Avez-vous déjà écrit un gestionnaire d'événements en TypeScript, essayé d'obtenir event.target.value — et reçu immédiatement un soulignement rouge et le message : « Property 'value' does not exist on type 'EventTarget' » ? Si oui, vous n'êtes pas seul. Sur Stack Overflow, cette question a recueilli des dizaines de milliers de vues, et elle continue de tourmenter les débutants et les développeurs expérimentés en 2025.

\n\n

Le problème n'est pas que TypeScript est « méchant » ou « cassé ». C'est tout le contraire : le compilateur vous protège contre des erreurs stupides qui pourraient survenir à l'exécution. Comprenons pourquoi cette erreur se produit et comment la corriger correctement.

\n\n

Pourquoi TypeScript se plaint-il de event.target.value ?

\n\n

Réponse courte : event.target a le type EventTarget | null. Et EventTarget n'a pas de propriété value. Il n'a que trois méthodes : addEventListener, removeEventListener et dispatchEvent.

\n\n

Lorsque vous écrivez :

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

TypeScript voit : « Hé, je ne sais pas quel élément HTML spécifique a déclenché cet événement. Peut-être que c'est un <div>, qui n'a pas de value, ou peut-être un <input> — je n'en suis pas sûr. Donc je refuse de compiler ce code ».

\n\n

C'est une fonctionnalité, pas un bug. TypeScript vous oblige à spécifier explicitement avec quel élément vous travaillez.

\n\n

Top 3 des méthodes de résolution (à jour pour 2025)

\n\n

Il existe plusieurs approches. Nous allons examiner les plus populaires et les plus sûres.

\n\n

1. Cast avec as HTMLInputElement (rapide, mais prudent)

\n\n

La méthode la plus courante — convertir event.target au type souhaité :

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

Avantages : simple, clair, fonctionne.

\n

Inconvénients : si vous vous trompez et que l'événement provient en réalité d'un <textarea> ou d'un <select>, vous obtiendrez undefined à l'exécution. Le compilateur ne vous préviendra pas.

\n\n

Il est préférable d'utiliser cette méthode lorsque vous êtes absolument certain du type de l'élément. Par exemple, dans des formulaires simples avec un seul champ.

\n\n

2. Utiliser event.currentTarget au lieu de event.target

\n\n

En TypeScript, currentTarget est typé plus strictement que target. Si vous spécifiez un paramètre générique pour l'événement, alors currentTarget aura le type correct :

\n\n
const handleChange = (event: React.ChangeEvent<HTMLInputElement>) => {\n  const value = event.currentTarget.value; // ✅ Fonctionne sans cast !\n};\n
\n\n

Important : currentTarget est l'élément sur lequel le gestionnaire est abonné. Si vous vous êtes abonné à un <input>, alors currentTarget sera toujours ce <input>. Contrairement à target, qui peut être un élément imbriqué (par exemple, un <span> à l'intérieur d'un bouton).

\n\n

Avantages : plus sûr qu'un cast, pas besoin d'écrire de conversions supplémentaires.

\n

Inconvénients : ne convient pas à tous les scénarios — par exemple, pour les événements de remontée (bubbling), currentTarget peut ne pas correspondre à l'élément cible.

\n\n

3. Fonction générique avec vérification (la méthode la plus sûre)

\n\n

Si vous voulez une sécurité maximale et une réutilisabilité, écrivez une fonction utilitaire qui vérifie le type de l'élément :

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

Blogs

Book Recommendations