O tipo 'string' não pode ser atribuído ao tipo: como entender e corrigir o erro TypeScript

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

«Type 'string' is not assignable to type» — o que é e por que você está aqui?

\n\n

Se você já escreveu em TypeScript, certamente já se deparou com o sublinhado vermelho no editor de código e a mensagem:

\n\n
Type 'string' is not assignable to type 'SomeType'.
\n\n

Este erro é um verdadeiro «alô» da tipagem forte. Ele assusta iniciantes, mas na verdade é o melhor amigo do desenvolvedor. Neste artigo, vamos entender por que ocorre o erro Type 'string' is not assignable to type, como corrigi-lo e quais abordagens existem para trabalhar com literais de string, union types e genéricos. O artigo foi escrito para o site educacional pythonlib.ru, mas os exemplos são totalmente em TypeScript.

\n\n

1. Raiz do problema: por que o TypeScript reclama de strings?

\n\n

TypeScript é uma extensão do JavaScript que adiciona tipagem estática. Quando você escreve:

\n\n
let role: 'admin' | 'user' = 'admin';\nrole = 'moderator'; // Erro: Type '"moderator"' is not assignable to type '"admin" | "user"'\n
\n\n

O TypeScript entende que a variável role pode aceitar apenas dois valores: 'admin' ou 'user'. Quando você tenta atribuir 'moderator', o compilador gera um erro. Mas por que ele escreve «Type 'string' is not assignable to type»?

\n\n

A questão é que o literal de string 'moderator' tem o tipo string, enquanto o tipo esperado é 'admin' | 'user'. O TypeScript compara tipos, não valores. Ele vê: «Você está me dando uma string comum, mas eu espero strings específicas». Daí a mensagem.

\n\n

1.1. Exemplo simples para entender

\n\n

Vamos considerar um caso básico:

\n\n
type Status = 'active' | 'inactive';\n\nfunction updateStatus(status: Status) {\n  console.log(status);\n}\n\nconst myStatus = 'active';\nupdateStatus(myStatus); // OK\n\nconst anotherStatus = 'pending';\nupdateStatus(anotherStatus); // Erro: Type 'string' is not assignable to type 'Status'\n
\n\n

No último caso, a variável anotherStatus é inferida como string, e não como 'pending'. O TypeScript não sabe que 'pending' é um literal. Ele vê apenas o tipo string. Isso pode ser corrigido especificando explicitamente o tipo:

\n\n
const anotherStatus: 'pending' = 'pending'; // Agora funciona\n
\n\n

2. Comparação de abordagens: como contornar ou corrigir o erro

\n\n

Existem várias maneiras de lidar com o erro Type 'string' is not assignable to type. Vamos compará-las em termos de simplicidade, segurança e desempenho.

\n\n

2.1. Abordagem 1: as const — congelamento do literal

\n\n

A maneira mais elegante é usar as const. Ele «congela» o valor como um literal:

\n\n
const myStatus = 'active' as const;\nupdateStatus(myStatus); // OK\n
\n\n

Vantagens: simples, legível, seguro.
\nDesvantagens: funciona apenas com const, não com let.

\n\n

2.2. Abordagem 2: Type Assertion (as) — conversão explícita

\n\n

Você pode dizer ao TypeScript: «Eu sei o que estou fazendo»:

\n\n
const someString: string = 'active';\nupdateStatus(someString as Status); // OK\n
\n\n

Vantagens: solução rápida.
\nDesvantagens: você desativa a verificação de tipos. Se passar um valor inválido, o erro só aparecerá em tempo de execução.

\n\n

2.3. Abordagem 3: Type Guard (guardião de tipo)

\n\n

Vamos escrever uma função que verifica se a string é um status válido:

\n\n
function isStatus(value: string): value is Status {\n  return value === 'active' || value === 'inactive';\n}\n\nfunction safeUpdate(value: string) {\n  if (isStatus(value)) {\n    updateStatus(value); // TypeScript sabe que value é Status\n  } else {\n    throw new Error('Status inválido');\n  }\n}\n

Blogs

Book Recommendations