Como converter string em enum no TypeScript: tutorial completo

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

Como converter string em enum no TypeScript: guia passo a passo

\n\n

Você já se deparou com uma situação em que a API retorna uma string, mas seu modelo TypeScript é estritamente tipado com enum? Ou talvez você esteja recebendo um valor do localStorage e queira convertê-lo com segurança para uma enumeração? Se sim, você veio ao lugar certo. Neste artigo, vamos abordar como converter string em enum no TypeScript — desde soluções simples até técnicas avançadas com tratamento de erros.

\n\n

Este tópico é um dos mais populares no Stack Overflow (milhares de visualizações!), e não é à toa. Mesmo desenvolvedores experientes frequentemente se confundem quando se trata de converter strings com segurança para enumerações. Vamos organizar tudo.

\n\n

O que é enum no TypeScript e por que convertê-lo?

\n\n

Enum (enumeração) é uma ferramenta poderosa do TypeScript que permite definir um conjunto de constantes nomeadas. Em vez de usar "strings mágicas" como 'active' ou 'pending', você define um enum e trabalha com valores tipados. Mas aqui está o problema: dados de fontes externas (API, formulários, arquivos de configuração) geralmente vêm como strings comuns. E então surge a pergunta: como converter string em enum TypeScript de forma segura e elegante?

\n\n
// Exemplo de enum\nenum Status {\n  Active = 'active',\n  Inactive = 'inactive',\n  Pending = 'pending'\n}\n\n// String da API\nconst apiStatus: string = 'active';\n// Como obter Status.Active? 🤔
\n\n

Método 1: Type Assertion (Afirmação de Tipo)

\n\n

O método mais simples, mas também o mais perigoso. Você simplesmente diz ao TypeScript: "Confie em mim, este é o valor correto".

\n\n
const status = apiStatus as Status;\n// ou\nconst status = <Status>apiStatus;
\n\n

Prós: Mínimo de código. Contras: Se a string não corresponder a nenhum valor do enum, você receberá undefined sem aviso. O TypeScript não lançará um erro, e você só descobrirá o problema em tempo de execução, quando algo quebrar.

\n\n

Este método só deve ser usado se você estiver absolutamente certo da fonte dos dados. Para produção — não é recomendado.

\n\n

Método 2: Usando uma função utilitária personalizada

\n\n

Este é o meio-termo entre simplicidade e segurança. Vamos escrever uma função que recebe uma string e verifica se esse valor existe no enum.

\n\n
function stringToEnum<T>(value: string, enumObject: T): T[keyof T] | undefined {\n  // Verificamos se o valor existe no enum\n  const enumValues = Object.values(enumObject) as string[];\n  if (enumValues.includes(value)) {\n    return value as unknown as T[keyof T];\n  }\n  return undefined;\n}\n\n// Uso\nconst status = stringToEnum(apiStatus, Status);\nif (status) {\n  console.log(status); // Status.Active\n} else {\n  console.error('Valor de status inválido');\n}
\n\n

Esta função converte com segurança uma string em enum no TypeScript. Se o valor não for encontrado, ela retorna undefined, e você pode tratar esse caso. Observe o genérico <T> — ele torna a função universal para qualquer enum.

\n\n

Método 3: Abordagem estrita com lançamento de erro

\n\n

Às vezes, undefined não é o que você precisa. É melhor lançar um erro explicitamente para detectar o problema rapidamente.

\n\n
function stringToEnumStrict<T>(value: string, enumObject: T): T[keyof T] {\n  const enumValues = Object.values(enumObject) as string[];\n  if (enumValues.includes(value)) {\n    return value as unknown as T[keyof T];\n  }\n  throw new Error(`Valor "${value}" não encontrado no enum`);\n}\n\n// Uso\ntry {\n  const status = stringToEnumStrict(apiStatus, Status);\n  // Trabalhamos com status\n} catch (error) {\n  console.error(error.message);\n  // Registramos o erro no Sentry ou outro sistema de monitoramento\n}

                
                

Blogs

Book Recommendations