Working with Enums
Enums são uma coleção de valores que são acessadas pelos nome
Assim basta declaramos com:
Understanding how Enums works
Eles são implementados pelo compilador e, em tempo de execução, viram código JavaScript padrão.
Cada valor de um enum recebe automaticamente um número inteiro sequencial, começando em 0 por padrão.
Podemos trabalhar com os valores de um Enum dentro de um array:
Como o Enum não é iteravel, podemos usar deste modo para iterar sobre ele, já que criando um array com os valores dele teremos isso:
Como o Enum é implementado usando valores numeros do JS um Enum pode ser atribuído a um número e exibido como um valor numérico:
O compilador enforça a checagem de type para enums, que significa que você vai receber um error se você tentar comprar valores de diferentes enums, a menos que eles tenham o mesmo valor numérico
Enums proveem um array-indexer de estilo sintatito que pode ser usado para obter o nome do valor, como isso:
Using a Specific Enum Values
Ótimo trecho! Vamos organizar e explicar o que está acontecendo com Enums no TypeScript quando usamos valores específicos ou expressões:
1. Valores padrão
Por padrão, o compilador atribui números sequenciais começando em 0:
No arquivo de declaração (index.d.ts), isso aparece como:
2. Valores constantes definidos pelo programador
Você pode atribuir manualmente um valor a um item do enum. O compilador continua incrementando a partir desse valor:
No .d.ts:
Usando expressões
O compilador também consegue avaliar expressões simples para definir valores:
No .d.ts:
Ou seja:
Hatusa o valor de outro enum (OtherEnum.First + 1).Umbrellaé calculado comoHat + Gloves.O compilador resolve essas expressões em tempo de compilação.
Using String Enums
Por padrão o compilador usa numeros para representar os enums, mas podemos usar valores strings para enums:
Understanding the Limitations of Enums
Enums podem até ser uteis mas como a vida não é um morango, ele possui limitações porque eles são implementadas inteiramente pelo compilador TypeScript e traduzido para JS
Understanding the Value-Checking Limitation
O compilador é excelente na checagem dos tipos para Enums mas isso não faz nada para valores númericos legais que são usados
O compilador não previne a atribuição de um número para uma variável que o tipo é um enum quando o número não correspondente para um dos valores enum, que é o porque a saida contem undefined porque o lookup fails procura uma correspondencia Product para um valor numérico
O mesmo problema afeta se a função usa um enum como seu tipo de retorno porque o compilador irá permitir isso para retornar qualquer valor numérico
Understanding the Type Guard Limitation
Um problema relacionado surge quando usamos um type guard. Testagem de tipos é feita usando a keyword do JS typeof e enums são implementados usando valores numericos, typeof não pode ser usado para ser distinguir entre valores enum e number:
Using constant Enums
Enums em TypeScript são usados para representar conjuntos de valores nomeados, mas quando definidos como const enum, o compilador substitui cada referência diretamente pelo valor numérico correspondente, sem criar o objeto JavaScript que normalmente permite a busca reversa (valor → nome). Isso reduz o tamanho do código gerado e pode trazer uma pequena melhoria de desempenho, porém elimina a possibilidade de acessar o nome de um membro pelo seu valor. Em resumo, enums normais oferecem mais flexibilidade, enquanto const enums priorizam eficiência e simplicidade no código compilado.
Em TypeScript sem const, um Enum normal:
Assim que compilado:
Aqui o objeto Product existe em tempo de execução permite fazer:
Usando com const:
Quando compila:
Vantagens e Limitações
Vantagem:
Código mais enxuto e rápido (sem criar objetos extras).
Pequeno ganho de performance.
Limitação:
Não é possível fazer lookup reverso (Product[0]).
Só aceita valores constantes ou expressões simples.
Se tentar acessar como objeto, dá erro: