Como converter string em enum no TypeScript: guia passo a passo
\n\nVocê 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.
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\nO que é enum no TypeScript e por que convertê-lo?
\n\nEnum (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?
// 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\nMétodo 1: Type Assertion (Afirmação de Tipo)
\n\nO método mais simples, mas também o mais perigoso. Você simplesmente diz ao TypeScript: "Confie em mim, este é o valor correto".
\n\nconst status = apiStatus as Status;\n// ou\nconst status = <Status>apiStatus;\n\nPró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.
Este método só deve ser usado se você estiver absolutamente certo da fonte dos dados. Para produção — não é recomendado.
\n\nMétodo 2: Usando uma função utilitária personalizada
\n\nEste é 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\nfunction 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\nEsta 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.
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.
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}