Usamos cookies para medir audiência e melhorar sua experiência. Você pode aceitar ou recusar a qualquer momento. Veja sobre o iMasters.
No cenário atual, muitos desenvolvedores enfrentam o bloqueio do uso de enums no TypeScript devido à ativação do flag --erasableSyntaxOnly. Essa mudança foi feita para otimizar a compilação e reduzir o tamanho do código gerado, mas traz um impacto direto na forma como se trabalha com tipos e constantes.
---
A principal questão é que enums representam uma estrutura intuitiva para mapear valores constantes, além de facilitar o uso de tipos seguros e autocompletados. Com a restrição de usar enums, muitos times se veem obrigados a buscar alternativas que mantenham a segurança de tipos, mas sem perder a clareza. A decisão fica mais saudável quando o time consegue medir o impacto depois. Sem esse critério, a solução pode parecer simples no começo e cara no suporte.
O método clássico de substituição é usar objetos com funções de tipo, porém essa abordagem pode parecer 'meio hacky' e pouco intuitiva. O exemplo mais comum é criar uma constante com os valores, como:
export const Environment = {
Development: 'development',
Production: 'production',
Test: 'test'
} as const. type Environment = (typeof Environment)[keyof typeof Environment].
Essa última linha, apesar de funcional, gera dúvidas sobre sua clareza e manutenção. Afinal, ela transforma o objeto em um tipo união de seus valores, mas não é intuitiva nem óbvia na primeira leitura. Por isso, o recorte precisa considerar manutenção, validação e caminho de volta. Esse contexto ajuda a separar ganho real de novidade difícil de sustentar. A decisão fica mais saudável quando o time consegue medir o impacto depois. Sem esse critério, a solução pode parecer simples no começo e cara no suporte.
---
Para simplificar, proponho uma estratégia que mantém a segurança de tipos e elimina ambiguidades na definição. Consiste em definir um objeto como as const e criar um tipo baseado nele, acessando seus valores de forma direta: Esse contexto ajuda a separar ganho real de novidade difícil de sustentar. A decisão fica mais saudável quando o time consegue medir o impacto depois. Sem esse critério, a solução pode parecer simples no começo e cara no suporte. O valor aparece melhor quando operação, produto e engenharia olham para o mesmo risco. Por isso, o recorte precisa considerar manutenção, validação e caminho de volta.
const MyEnum = {
FOO: 0,
BAR: 1,
BAZ: 2
} as const. type MyEnum = (typeof MyEnum)[keyof typeof MyEnum]. export { MyEnum }. A decisão fica mais saudável quando o time consegue medir o impacto depois.
Ao importar, podemos usar como:
import { MyEnum } from './MyEnum'. const someData: Record<MyEnum, any> = {
[MyEnum.FOO]: 'foo',
// ...
}. Sem esse critério, a solução pode parecer simples no começo e cara no suporte. O valor aparece melhor quando operação, produto e engenharia olham para o mesmo risco.
Com essa abordagem, o valor e o tipo vêm do mesmo lugar, e a leitura fica mais clara. Além disso, evita a confusão do uso de typeof na última linha, que muitas vezes é vista como uma 'folha de salada' na leitura. O valor aparece melhor quando operação, produto e engenharia olham para o mesmo risco. Por isso, o recorte precisa considerar manutenção, validação e caminho de volta. Esse contexto ajuda a separar ganho real de novidade difícil de sustentar. A decisão fica mais saudável quando o time consegue medir o impacto depois. Sem esse critério, a solução pode parecer simples no começo e cara no suporte. O valor aparece melhor quando operação, produto e engenharia olham para o mesmo risco.
---
Essa solução, apesar de mais limpa, ainda exige que você defina claramente seus valores e tipos em um só lugar, o que ajuda na manutenção. Porém, há algumas limitações:
Por outro lado, essa abordagem garante melhor compatibilidade com o TypeScript moderno e evita surpresas na compilação. Por isso, o recorte precisa considerar manutenção, validação e caminho de volta. O valor aparece melhor quando operação, produto e engenharia olham para o mesmo risco. Por isso, o recorte precisa considerar manutenção, validação e caminho de volta. O valor aparece melhor quando operação, produto e engenharia olham para o mesmo risco. O valor aparece melhor quando operação, produto e engenharia olham para o mesmo risco. O valor aparece melhor quando operação, produto e engenharia olham para o mesmo risco. O valor aparece melhor quando operação, produto e engenharia olham para o mesmo risco.
Se sua equipe busca uma alternativa ao enum por questões de performance ou restrições do compilador, a melhor saída é usar objetos imutáveis (as const) combinados com union types derivados. Assim, você mantém segurança de tipos, facilita a leitura e evita o que parece uma solução 'meio enjamada'. Esse contexto ajuda a separar ganho real de novidade difícil de sustentar. A decisão fica mais saudável quando o time consegue medir o impacto depois. Por isso, o recorte precisa considerar manutenção, validação e caminho de volta. Por isso, o recorte precisa considerar manutenção, validação e caminho de volta. Por isso, o recorte precisa considerar manutenção, validação e caminho de volta.
Implementar essa mudança demanda um pouco de disciplina na padronização, mas traz benefícios claros no longo prazo. A decisão fica mais saudável quando o time consegue medir o impacto depois. Sem esse critério, a solução pode parecer simples no começo e cara no suporte. Esse contexto ajuda a separar ganho real de novidade difícil de sustentar. Esse contexto ajuda a separar ganho real de novidade difícil de sustentar. Esse contexto ajuda a separar ganho real de novidade difícil de sustentar. Esse contexto ajuda a separar ganho real de novidade difícil de sustentar. A decisão fica mais saudável quando o time consegue medir o impacto depois. Esse contexto ajuda a separar ganho real de novidade difícil de sustentar.
---
Sei que muitas equipes ainda têm dúvidas e preferem soluções mais tradicionais, mas vale experimentar essa abordagem. Talvez ela ajude a evitar dores de cabeça na hora de manter o código limpo e eficiente. Sem esse critério, a solução pode parecer simples no começo e cara no suporte. O valor aparece melhor quando operação, produto e engenharia olham para o mesmo risco. A decisão fica mais saudável quando o time consegue medir o impacto depois. A decisão fica mais saudável quando o time consegue medir o impacto depois. A decisão fica mais saudável quando o time consegue medir o impacto depois. A decisão fica mais saudável quando o time consegue medir o impacto depois.
Carregando comentários...