Tipo never no TypeScript: como corrigir o erro "not assignable to parameter"

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

Introdução: por que o TypeScript reclama de um array vazio?

\n\n

Você já escreveu código em TypeScript, executou a compilação e recebeu uma mensagem misteriosa: "Argument of type 'X' is not assignable to parameter of type 'never'"? Se sim — você não está sozinho. Esse erro é uma verdadeira pedra no sapato para desenvolvedores de todos os níveis. No Stack Overflow, essa pergunta acumulou milhares de visualizações, e hoje vamos resolvê-la de uma vez por todas.

\n\n

Imagine a situação: você declara um array vazio, tenta adicionar algo a ele, e o TypeScript bloqueia a operação. Familiar? Vamos entender por que isso acontece e, principalmente, como corrigir.

\n\n

Neste artigo, não vamos apenas traduzir a documentação técnica. Vamos percorrer o caminho desde o aparecimento do erro até sua eliminação completa, com exemplos reais que você pode aplicar imediatamente em seus projetos.

\n\n

O que é o tipo never no TypeScript?

\n\n

Antes de mergulhar nos detalhes dos erros, vamos entender o próprio tipo never. No TypeScript, esse tipo significa "um valor que não pode existir". Parece filosófico, mas na prática é simples:

\n\n
    \n
  • never é o tipo para funções que nunca terminam (loop infinito) ou sempre lançam uma exceção.
  • \n
  • never é o "fundo" do sistema de tipos. Você pode atribuir never a qualquer coisa, mas nada pode ser atribuído a never (exceto o próprio never).
  • \n
\n\n

Agora imagine que o TypeScript vê um array vazio e não sabe quais elementos ele conterá. No modo de tipagem estrita (strict: true no tsconfig.json), o compilador faz uma conclusão lógica: "Se o array está vazio e o tipo não foi especificado, então nada pode estar nele — o tipo dos elementos é never".

\n\n
// Exemplo: TypeScript infere o tipo como never[]\nconst emptyArray = [];\nemptyArray.push("hello"); // Erro!\n// Argument of type 'string' is not assignable to parameter of type 'never'\n
\n\n

Aí está o erro. O TypeScript avisa honestamente: "Você disse que o array pode conter apenas never, mas está tentando adicionar uma string. Isso não vai funcionar!"

\n\n

Principais cenários de ocorrência do erro

\n\n

1. Array vazio sem anotação de tipo

\n\n

O caso mais comum. O desenvolvedor cria um array vazio, planejando preenchê-lo depois, mas esquece de especificar o tipo.

\n\n
// ❌ Problema\nconst items = []; // TypeScript infere: any[] (se strict: false) ou never[] (se strict: true)\nitems.push({ id: 1, name: "Alice" }); // Erro com strict: true\n\n// ✅ Solução: especifique o tipo explicitamente\nconst items: Array<{ id: number; name: string }> = [];\nitems.push({ id: 1, name: "Alice" }); // Funciona!\n
\n\n

2. Métodos de array que retornam never (filter, reduce)

\n\n

O método filter com um predicado incorreto ou reduce sem valor inicial podem levar à inferência do tipo never.

\n\n
// ❌ Problema com filter\nconst numbers: (number | null)[] = [1, null, 2, null, 3];\nconst onlyNumbers = numbers.filter(item => item !== null); \n// TypeScript pode inferir o tipo como (number | null)[] ou até never[], se o predicado estiver "quebrado"\n\n// ✅ Solução: use type guard\nconst onlyNumbersSafe: number[] = numbers.filter((item): item is number => item !== null); \n\n// ❌ Problema com reduce\nconst result = [1, 2, 3].reduce((acc, val) => acc + val); \n// Erro! TypeScript não sabe o tipo inicial do acumulador\n\n// ✅ Solução: especifique o valor inicial\nconst resultSafe = [1, 2, 3].reduce((acc, val) => acc + val, 0); // Funciona!\n
\n\n

3. Genéricos e tipos condicionais

\n\n

Um caso mais complexo — quando o TypeScript não consegue inferir o tipo devido a generalizações complexas.

\n\n
// ❌ Problema\nfunction getFirstElement<T>(arr: T[]): T | undefined {\n  return arr[0];\n}\n\nfunction processItems<T>                

Blogs

Book Recommendations