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.
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
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.