Executando verificação de segurança...
2

Por que você deveria evitar enums no TypeScript

Enums são uma das poucas features do TypeScript que eu recomendo evitar, e na verdade eu tenho lidado com isso de outra forma nos meus projetos.

Vou explicar o porquê, começando com:

Problema de runtime

Um enum como este:

enum UserType {
  Admin = "admin",
  Common = "common"
}

Gera código de runtime no seu bundle:

var UserType;
(function (UserType) {
    UserType["Admin"] = "admin";
    UserType["Common"] = "common";
})(UserType || (UserType = {}));

TypeScript deveria ser uma linguagem zero-runtime, e os enums quebram essa regra.

Enums numéricos são inseguros

Ok, talvez isso não seja tão grande assim, mas olha isso:

enum Status {
  Active,   // 0
  Inactive  // 1
}

const status: Status = 999; // TypeScript aceita QUALQUER número!!!

Se você reordenar os membros, todos os valores mudam. TypeScript não vai pegar isso. Pode acontecer né... E ninguém vai ver na PR.

A forma melhor que eu uso

export const UserType = {
  Admin: "admin",
  Common: "common",
} as const;

export type UserType = typeof UserType[keyof typeof UserType];

Ou ainda mais simples com arrays, dependendo do seu caso:

const USER_TYPES = ["admin", "common"] as const;
type UserType = typeof USER_TYPES[number]; // "admin" | "common"

Mesma segurança de tipos, zero código de runtime, e você pode derivar tipos diretamente dos seus dados.

Sinceramente eu prefiro a primeira opção com export const UserType.

Ah, e o Anders Hejlsberg, criador do TypeScript, já expressou que não incluiria enums se pudesse começar de novo. Então...

Use const objects ou const arrays no lugar.

Como vocês lidam com enums?

Carregando publicação patrocinada...