A propriedade 'value' não existe no tipo 'EventTarget': solução 2025

Treinador Online de Python para Iniciantes

Aprenda Python facilmente sem sobrecarga teórica. Resolva tarefas práticas com verificação automática e escreva código diretamente no navegador.

Start Course

«Property 'value' does not exist on type 'EventTarget'» — como parar de temer e começar a tipar eventos no TypeScript

\n\n

Você já escreveu um manipulador de eventos no TypeScript, tentou obter event.target.value — e imediatamente recebeu um sublinhado vermelho e a mensagem: «Property 'value' does not exist on type 'EventTarget'»? Se sim — você não está sozinho. No Stack Overflow, esta pergunta acumulou dezenas de milhares de visualizações e continua a atormentar novatos e desenvolvedores experientes em 2025.

\n\n

O problema não é que o TypeScript seja "malvado" ou "quebrado". Muito pelo contrário: o compilador protege você de erros bobos que poderiam ocorrer em tempo de execução. Vamos entender por que esse erro ocorre e como corrigi-lo corretamente.

\n\n

Por que o TypeScript reclama de event.target.value?

\n\n

Resposta curta: event.target tem o tipo EventTarget | null. E EventTarget não possui a propriedade value. Ele tem apenas três métodos: addEventListener, removeEventListener e dispatchEvent.

\n\n

Quando você escreve:

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

O TypeScript vê: "Ei, eu não sei qual elemento HTML específico disparou este evento. Pode ser uma <div>, que não tem value, ou pode ser um <input> — não tenho certeza. Portanto, recuso-me a compilar este código".

\n\n

Isso é uma característica, não um bug. O TypeScript força você a especificar explicitamente com qual elemento está trabalhando.

\n\n

Top 3 formas de resolver (relevante para 2025)

\n\n

Existem várias abordagens. Vamos ver as mais populares e seguras.

\n\n

1. Cast com as HTMLInputElement (rápido, mas com cuidado)

\n\n

A forma mais comum é fazer um cast de event.target para o tipo desejado:

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

Prós: simples, claro, funciona.

\n

Contras: se você se enganar e o evento vier de uma <textarea> ou <select>, receberá undefined em tempo de execução. O compilador não avisará.

\n\n

É melhor usar este método quando você tem absoluta certeza do tipo do elemento. Por exemplo, em formulários simples com um único campo.

\n\n

2. Usar event.currentTarget em vez de event.target

\n\n

No TypeScript, currentTarget é tipado de forma mais estrita que target. Se você especificar o parâmetro genérico para o evento, currentTarget terá o tipo correto:

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

Importante: currentTarget é o elemento ao qual o manipulador está vinculado. Se você vinculou a um <input>, currentTarget sempre será esse <input>. Diferente de target, que pode ser um elemento aninhado (por exemplo, um <span> dentro de um botão).

\n\n

Prós: mais seguro que cast, não requer conversões extras.

\n

Contras: não é adequado para todos os cenários — por exemplo, para eventos de propagação (bubbling), currentTarget pode não coincidir com o elemento alvo.

\n\n

3. Função genérica com verificação (a forma mais segura)

\n\n

Se você deseja máxima segurança e reutilização, escreva uma função auxiliar que verifique o tipo do elemento:

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

Blogs

Book Recommendations