Por que não gosto de Enums no Typescript?

Wilcson Santana
2 min readJan 13, 2023

Enums como já devem saber; não é nativo do javascript e foi adicionado ao typescript muito cedo. Talvez porque eles queriam trazer esse feeling da orientação a objetos do C# para o typescript.

Em run-time os enums são muito imprevisíveis, perceba na imagem que cada item do enum recebe um valor default e o código transpilado para javascript fica meio esquisito:

então, você teria este objeto:

const LOG_LEVEL = {
DEBUG: 0,
0: 'DEBUG',
WARNING: 1,
1: 'WARNING',
ERROR: 2,
2: 'ERROR',
}

E esse não é o comportamento que você espera de um objeto. Você pode resolver isso explicitando string por string, porém, perderia o sentido de usar o enum pois as coisas não seriam atreladas automaticamente.

Segue um exemplo para ficar mais fácil de entender:

enum LogLevel {
WARN = 'WARN',
DEBUG = 'DEBUG',
ERROR = 'ERROR'
}

function log(message: string, level: LogLevel) {
console.log(level)
console.log(message)
console.log('pong')
}

log('ping', LogLevel.DEBUG)

Você só consegue acessar o conteúdo do enum utilizando LogLevel.DEBUG. Você não pode ‘chamar’ um membro de um enum que não está expresso nele próprio. Veja no exemplo:

Isso quebra o conceito do typescript de ser um superset de tipagem estrutural; o que significa que o typescript não se importa com o nome das coisas e sim com os seus valores em runtime e olhando para nossa segunda imagem o valor de runtime é ‘DEBUG’.

Então, digamos que o enum meio que quebra a regra do typescript.

Você pode ler mais sobre enums na documentação.

Veja alternativas para não usar enums.

Veja vários casos de uso para o enum.

--

--

Wilcson Santana
0 Followers

Full-Stack web-developer - Typescript - Rust