TypeScript Tipos Básico
Enums e literais
Em TypeScript, enums permitem definir um conjunto de constantes nomeadas, facilitando a leitura e a manutenção do código. Existem dois tipos principais: enum (que gera código JavaScript extra) e const enum (que é completamente removido na compilação, substituindo os valores diretamente).
Uma alternativa mais leve e idiomática é usar união de literais: type Direction = 'Up' | 'Down'. Isso evita a geração de código extra e ainda oferece verificação de tipos. Combinado com as const, você pode criar objetos que se comportam como enums, com a vantagem de serem apenas objetos JavaScript puros.
Cada abordagem tem seu lugar: enums são úteis quando você precisa de valores numéricos ou de um namespace, enquanto uniões de literais são preferíveis para valores string e quando se deseja zero overhead em runtime. O uso de as const é ideal para manter a imutabilidade e inferência literal.
Pontos-chave
enumgera um objeto JavaScript em tempo de execução, enquantoconst enumé apagado na compilação.- Uniões de literais (
type X = 'a' | 'b') são mais leves e não geram código extra. as consttorna um objeto literal imutável e preserva os tipos literais de suas propriedades.- Prefira uniões de literais ou
as constpara valores string; useenumquando precisar de valores numéricos ou de um namespace.
// Exemplo de enum numérico enum Direction {
Up = 1,
Down,
Left,
Right,
}
// const enum: não gera código JS, os valores são inline
const enum Status {
Active = 'ACTIVE',
Inactive = 'INACTIVE',
}
// União de literais: mais leve e sem código extra
type Color = 'red' | 'green' | 'blue';
// as const: objeto imutável com tipos literais
const Colors = {
Red: 'red',
Green: 'green',
Blue: 'blue',
} as const;
type ColorFromConst = typeof Colors[keyof typeof Colors]; // 'red' | 'green' | 'blue'
function move(direction: Direction): void {
console.log(`Movendo para ${Direction[direction]}`);
}
function paint(color: Color): void {
console.log(`Pintando de ${color}`);
}
move(Direction.Up);
paint(Colors.Red);
console.log(Status.Active); // 'ACTIVE'