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?