Por que não gosto de Enums no Typescript?
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.