Enums no TypeScript: Guia Completo com Exemplos Práticos

O TypeScript atua como uma extensão do JavaScript, introduzindo um sistema de tipagem robusto para aprimorar a segurança do código.

Ao adotar o TypeScript, os desenvolvedores podem identificar e corrigir erros de maneira mais eficiente, já nas primeiras fases do desenvolvimento. Os Enums, ou enumerações, são uma das ferramentas cruciais que o TypeScript oferece para facilitar a criação de código mais seguro e confiável. Enums são uma construção popular em TypeScript que ajuda você a escrever um código mais seguro.

Este artigo tem como objetivo detalhar o que são Enums, como criá-los e utilizá-los, além de outras considerações relevantes.

O que é um Enum?

Enum é a abreviação de tipo enumerado. Um tipo de dados enumerado é definido pelos diferentes valores que uma variável desse tipo pode assumir. Os diferentes valores que pode assumir são frequentemente chamados de membros ou elementos.

Neste artigo, iremos nos referir a eles como membros. Enums não são um recurso exclusivo do TypeScript; tipos enumerados também são utilizados em outras linguagens de programação. A implementação de enums resulta em maior segurança de tipo nos programas TypeScript.

Recomendação de leitura: Principais bibliotecas e ambientes de execução do TypeScript para desenvolvedores

Por que usar Enumerações?

Enums simplificam a especificação dos valores que uma variável ou um argumento de função pode aceitar. Isso assegura que os desenvolvedores sempre forneçam os valores esperados, reduzindo a ocorrência de bugs e promovendo um código mais robusto e seguro.

Pré-requisitos para trabalhar com Enums

Este guia prático abordará como trabalhar com Enums no TypeScript. Para acompanhar os exemplos, é necessário ter um ambiente de desenvolvimento TypeScript configurado e funcionando.

Certifique-se de ter o Node.js instalado para executar códigos JavaScript. Se o TypeScript ainda não estiver instalado, sugiro que consulte o vídeo abaixo para obter instruções detalhadas:

Uma alternativa para compilar e executar scripts imediatamente é utilizar o ts-node. Embora eu utilize esta opção neste artigo, para projetos maiores, recomendo instalar o TypeScript. Para executar um script usando ts-node, utilize o seguinte comando:

npx ts-node <nome_do_script>

Este artigo também pressupõe que você esteja familiarizado com JavaScript e conceitos básicos do TypeScript.

Trabalhando com um Enum Simples

Como Criar um Enum Simples

Em TypeScript, Enums são criados usando a palavra-chave `enum`, seguida pelo nome do enum e a lista de seus membros. O exemplo abaixo demonstra a declaração de uma enumeração para os pontos cardeais:

enum Direcao {
    Norte,
    Leste,
    Sul,
    Oeste
}

Note que os membros do enum não são strings, portanto não requerem aspas.

Como Usar um Enum Simples

A atribuição de um valor de enum a uma variável é realizada da seguinte maneira:

const pontoCardinal: Direcao = Direcao.Norte;

Como a variável é atribuída na declaração, o TypeScript pode inferir o tipo de dados. Assim, podemos simplificar a declaração:

const pontoCardinal = Direcao.Norte;

Para descobrir o valor armazenado na variável `pontoCardinal`, podemos usar `console.log`:

console.log(pontoCardinal);

O resultado será:

0

Apesar de atribuirmos `Direcao.Norte`, a variável armazena o valor zero. Isso ocorre porque cada membro de um enum recebe um valor numérico começando por zero. O primeiro membro recebe 0, o segundo 1, e assim por diante. Veja o exemplo:

console.log(Direcao.Norte, Direcao.Leste, Direcao.Sul, Direcao.Oeste)

Portanto, podemos verificar se a variável `pontoCardinal` é igual a Norte, comparando-a com zero:

// Comparação por igualdade
let ehNorte = pontoCardinal == 0;

// Imprime o resultado
console.log(ehNorte);

Como vimos, `Direcao.Norte` é igual a 0. Portanto, em vez de compararmos com o número zero, podemos comparar diretamente com `Direcao.Norte`:

// Verifica se a direção é Norte
ehNorte = pontoCardinal == Direcao.Norte;

// Imprime o resultado
console.log(ehNorte);

Esta abordagem é útil e provavelmente a forma como você utilizará os valores de enums. No entanto, você pode ir além, como veremos adiante. A próxima seção abordará como trabalhar com valores personalizados.

Trabalhando com Valores Personalizados

Por padrão, o TypeScript atribui valores numéricos a membros de enum começando do zero. Contudo, você pode definir valores personalizados para cada membro. Por exemplo:

enum AvaliacaoEstrelas {
    MuitoRuim = 1,
    Ruim = 2,
    Mediano = 3,
    Bom = 4,
    Excelente = 5
}

Uma alternativa seria:

enum AvaliacaoEstrelas {
    MuitoRuim = 1,
    Ruim,
    Mediano,
    Bom,
    Excelente
}

Neste caso, o primeiro membro recebe o valor 1, e os seguintes são incrementados automaticamente a partir do valor anterior. Assim, `Ruim` recebe 2, `Mediano` recebe 3, e assim por diante.

Os membros de um enum não se limitam a valores numéricos, como veremos adiante. No entanto, aqueles com valores numéricos se comportam como números comuns.

console.log(typeof AvaliacaoEstrelas.Mediano);

O resultado será “number”. Isso significa que você pode realizar operações numéricas, incluindo comparações:

console.log(AvaliacaoEstrelas.Excelente > AvaliacaoEstrelas.Mediano)

Isso imprimirá “true”.

Utilizando Strings como Valores Personalizados

Como mencionado anteriormente, os membros de um enum podem receber valores de string em vez de apenas números. Veja como:

enum Escolha {
    PilulaVermelha = "Saber Tudo"
    PilulaAzul = "Não Saber Nada"
}

Neste caso, os membros de enum se comportarão de forma similar, mas, por serem strings, permitirão operações típicas de strings em vez de operações numéricas.

Enums Heterogêneos

É possível misturar strings e valores numéricos em um mesmo enum, embora isso não seja recomendado e não seja muito útil.

enum Misto {
    Primeiro = "String"
    Segundo = 2
}

Considerações Finais

Neste artigo, exploramos o conceito de Enums em TypeScript, sua importância e os diferentes tipos de valores que seus membros podem ter.

Recomendamos a leitura do nosso artigo sobre Tipo vs. Interface em TypeScript.