Resolver Erros Comuns do TypeScript 2026
Erros do TypeScript parecem intimidadores no começo, mas cada código de erro tem uma solução direta. Veja como resolver TS2322, TS2345, TS2339, TS7006 e TS2304 com exemplos práticos
Por que isso é importante
Resolver Erros Comuns do TypeScript 2026. Erros do TypeScript parecem intimidadores no começo, mas cada código de erro tem uma solução direta. Veja como resolver TS2322, TS2345, TS2339, TS7006 e TS2304 com exemplos práticos e sem enrolação.
Entendendo os Erros do TypeScript
Todo erro do TypeScript vem com um código no formato TSxxxx. Esse número identifica exatamente o tipo de problema. Quando você vê TS2322, não precisa adivinhar: é sempre sobre atribuição de tipo incompatível. Isso torna a pesquisa mais precisa e a solução mais rápida.
A maioria dos erros aparece quando você ativa o modo strict no tsconfig.json. Isso é bom. O strict pega problemas que passariam batido e só estourariam em produção. A dor de resolver esses erros agora é bem menor que debugar em produção às 3 da manhã.
Vamos atacar cada erro com o mesmo formato: o que significa, quando aparece, e como resolver com código. Sem teoria desnecessária. Direto ao ponto.
Passo a Passo: Resolvendo Cada Erro
O processo pra resolver qualquer erro do TypeScript segue uma lógica consistente.
- Passo 1 - Leia o código do erro (TSxxxx): O número identifica a categoria. TS2xxx são erros de tipo. TS7xxx são erros de declaração implícita. Pesquise o código exato quando tiver dúvida.
- Passo 2 - Leia a mensagem completa: O TypeScript mostra o tipo esperado e o tipo recebido. Compare os dois. Geralmente a resposta tá ali na mensagem mesmo.
- Passo 3 - Verifique o tipo da variável/parâmetro: Passe o mouse sobre a variável no editor. O VSCode mostra o tipo inferido. Compare com o que você esperava.
- Passo 4 - Ajuste o tipo, não o valor: Primeiro tente corrigir a tipagem. Se a interface tá errada, conserte a interface. Type assertion (as) deve ser último recurso.
- Passo 5 - Use narrowing quando tipos se misturam: Se o erro envolve union types, use if/typeof/instanceof pra estreitar o tipo antes de usar.
- Passo 6 - Ative strict e resolva de uma vez: Melhor sofrer uma vez ativando strict do que descobrir bugs espalhados pelo projeto. Resolva todos os erros que aparecem.
TS2322: Type 'X' is not assignable to type 'Y'
Esse é o erro mais frequente do TypeScript. Aparece quando você tenta atribuir um valor de um tipo a uma variável que espera outro tipo. Pode ser uma atribuição direta, um retorno de função ou uma prop de componente React.
// ❌ ERRO: Type 'string' is not assignable to type 'number'
let idade: number = "vinte";
// ✅ SOLUÇÃO 1: Corrigir o valor
let idade: number = 20;
// ✅ SOLUÇÃO 2: Corrigir o tipo
let idade: string = "vinte";
// ❌ ERRO em objetos
interface Usuario {
nome: string;
ativo: boolean;
}
const user: Usuario = {
nome: "Maria",
ativo: "sim", // Type 'string' is not assignable to type 'boolean'
};
// ✅ SOLUÇÃO: Corrigir o valor pra boolean
const user: Usuario = {
nome: "Maria",
ativo: true,
};
// ❌ ERRO com union types
type Status = "ativo" | "inativo" | "pendente";
let estado: Status = "bloqueado"; // não existe na union
// ✅ SOLUÇÃO: Adicionar à union ou usar valor válido
type Status = "ativo" | "inativo" | "pendente" | "bloqueado";
let estado: Status = "bloqueado";
Regra de ouro pro TS2322: sempre olhe os dois tipos na mensagem. O primeiro é o que você tem, o segundo é o que o TypeScript espera. Ajuste um dos dois.
TS2345: Argument of type 'X' is not assignable to parameter of type 'Y'
Parecido com o TS2322, mas aqui o erro tá no argumento passado pra uma função. Você chamou uma função com um valor que não bate com o tipo esperado pelo parâmetro.
// ❌ ERRO: Argument of type 'string' is not assignable
// to parameter of type 'number'
function dobrar(valor: number): number {
return valor * 2;
}
dobrar("10"); // string não é number
// ✅ SOLUÇÃO 1: Converter o valor
dobrar(Number("10"));
dobrar(parseInt("10", 10));
// ✅ SOLUÇÃO 2: Aceitar mais tipos na função
function dobrar(valor: number | string): number {
const num = typeof valor === "string" ? Number(valor) : valor;
return num * 2;
}
// ❌ ERRO com objetos parciais
interface Config {
host: string;
port: number;
ssl: boolean;
}
function conectar(config: Config) { /* ... */ }
conectar({ host: "localhost", port: 3000 });
// Falta a propriedade 'ssl'
// ✅ SOLUÇÃO: Tornar opcional ou passar completo
interface Config {
host: string;
port: number;
ssl?: boolean; // agora é opcional
}
// Ou usar Partial<Config> se tudo pode ser opcional
function conectar(config: Partial<Config>) { /* ... */ }
TS2339: Property 'X' does not exist on type 'Y'
Esse erro aparece quando você tenta acessar uma propriedade que não existe no tipo declarado. É muito comum com APIs externas, objetos genéricos e union types.
// ❌ ERRO: Property 'telefone' does not exist on type 'Usuario'
interface Usuario {
nome: string;
email: string;
}
const user: Usuario = { nome: "João", email: "joao@email.com" };
console.log(user.telefone); // não existe na interface
// ✅ SOLUÇÃO 1: Adicionar à interface
interface Usuario {
nome: string;
email: string;
telefone?: string; // opcional
}
// ✅ SOLUÇÃO 2: Estender a interface
interface UsuarioCompleto extends Usuario {
telefone: string;
endereco: string;
}
// ❌ ERRO com dados de API sem tipagem
const response = await fetch("/api/data");
const data = await response.json(); // tipo: any
// Funciona mas sem segurança. Se a API mudar, nenhum erro.
// ✅ SOLUÇÃO: Tipar o retorno
interface ApiResponse {
users: Usuario[];
total: number;
}
const data: ApiResponse = await response.json();
console.log(data.users); // tipado corretamente
console.log(data.total); // autocomplete funciona
Quando esse erro aparece, a pergunta certa é: a propriedade deveria existir? Se sim, atualize a interface. Se não, você tá tentando acessar algo que não faz sentido, e o TypeScript acabou de te salvar de um bug.
TS7006: Parameter 'x' implicitly has an 'any' type
Esse erro só aparece com noImplicitAny ativado (que vem junto do strict). Significa que o TypeScript não conseguiu inferir o tipo de um parâmetro e você não declarou explicitamente.
// ❌ ERRO: Parameter 'item' implicitly has an 'any' type
function processar(item) {
return item.nome;
}
// ✅ SOLUÇÃO: Declarar o tipo do parâmetro
function processar(item: { nome: string }): string {
return item.nome;
}
// ❌ ERRO em callbacks de array
const numeros = [1, 2, 3];
numeros.forEach(function(n) { // n é implicitamente any
console.log(n * 2);
});
// ✅ SOLUÇÃO 1: Arrow function (inferência funciona melhor)
numeros.forEach((n) => console.log(n * 2));
// ✅ SOLUÇÃO 2: Tipo explícito
numeros.forEach((n: number) => console.log(n * 2));
// ❌ ERRO em event handlers
document.addEventListener("click", function(e) {
console.log(e.target); // e é implicitamente any
});
// ✅ SOLUÇÃO: Tipar o evento
document.addEventListener("click", (e: MouseEvent) => {
console.log(e.target);
console.log(e.clientX); // autocomplete de MouseEvent
});
A regra é simples: se o TypeScript não consegue inferir, você declara. Arrow functions em métodos de array geralmente não precisam de tipo explícito porque o TypeScript infere pelo array. Mas em funções soltas e callbacks, sempre declare.
TS2304: Cannot find name 'X'
Aparece quando você usa um nome que o TypeScript não reconhece. Pode ser uma variável não declarada, um tipo que falta importar ou um tipo global que precisa de type definitions.
// ❌ ERRO: Cannot find name 'Usuario'
function criar(dados: Usuario) { // Usuario não foi importado
// ...
}
// ✅ SOLUÇÃO: Importar o tipo
import { Usuario } from "./types";
function criar(dados: Usuario) {
// ...
}
// ❌ ERRO: Cannot find name 'process'
console.log(process.env.NODE_ENV);
// ✅ SOLUÇÃO: Instalar types do Node
// npm install --save-dev @types/node
// E adicionar no tsconfig.json:
// "types": ["node"]
// ❌ ERRO: Cannot find name 'describe' (em testes)
describe("Meu teste", () => {
it("deve funcionar", () => { /* ... */ });
});
// ✅ SOLUÇÃO: Instalar types do framework de teste
// npm install --save-dev @types/jest
// ou @types/mocha
// ❌ ERRO: Cannot find name 'HTMLElement'
const el: HTMLElement = document.getElementById("app")!;
// ✅ SOLUÇÃO: Verificar lib no tsconfig.json
// "lib": ["ES2020", "DOM", "DOM.Iterable"]
Quando vir TS2304, verifique três coisas nessa ordem: o import tá certo? O pacote @types tá instalado? A lib tá configurada no tsconfig.json? Isso resolve 99% dos casos.
Erros de Type Assertion e Strict Mode
Cuidado com soluções rápidas que escondem problemas
Usar 'as any' pra silenciar erros: isso resolve o compilador mas cria bugs invisíveis. Se você precisa de assertion, use 'as TipoEspecifico' e nunca 'as any'. Cada 'as any' no código é uma bomba-relógio.
Desativar strict pra sumir com os erros: parece solução, mas é cilada. Você perde proteção contra null, any implícito e vários outros checks. Ative strict desde o início do projeto e resolva os erros conforme aparecem.
Usar @ts-ignore sem comentário explicativo: se precisar ignorar um erro, use @ts-expect-error com uma explicação do motivo. Pelo menos assim, quando alguém mexer no código, sabe por que o ignore tá ali.
Não instalar @types de bibliotecas: muitas libs JavaScript não têm tipos nativos. Sempre procure @types/nomedopackage no npm. Sem isso, tudo vira any e o TypeScript perde utilidade naquela parte do código.
Ignorar strictNullChecks: esse check sozinho pega toneladas de bugs de null/undefined. Ativar dói no começo, mas depois você nunca mais vai ter 'Cannot read properties of undefined' em produção.
Checklist de Resolução de Erros
- TS2322 resolvido: tipos de atribuição batem com as interfaces
- TS2345 resolvido: argumentos de função com tipos corretos
- TS2339 resolvido: interfaces atualizadas com todas as propriedades
- TS7006 resolvido: parâmetros com tipos explícitos onde inferência não funciona
- TS2304 resolvido: imports corretos e @types instalados
- Modo strict ativado no tsconfig.json
- Zero uso de 'as any' no código
- Todos os @ts-ignore trocados por @ts-expect-error com explicação
Erros do TypeScript Nunca Mais
Resolver erros de compilação é só o começo. No CrazyStack, você aprende a escrever código TypeScript que não gera erros em primeiro lugar. Tipagem sólida, padrões avançados e strict mode desde o dia um. Tudo isso construindo um SaaS completo com Node.js e React do zero ao deploy.
Se você quer parar de lutar contra o compilador e fazer dele seu melhor aliado, esse é o próximo passo.