Types (Type Aliases)
Os Type Aliases (ou simplesmente types) são usados para criar um novo nome para um tipo. Eles são muito mais flexíveis que as interfaces, pois podem representar qualquer tipo de dado, não apenas objetos.
1. Quando usar Types?
Você deve usar type para situações que exigem flexibilidade lógica que as interfaces não oferecem.
A. Uniões (Unions) e Interseções
É o uso mais comum. Quando um valor pode ser uma coisa OU outra.
type Status = 'loading' | 'success' | 'error';
type Response = { data: string } & { status: number };B. Primitivos e Aliases
Para dar nomes semânticos a tipos básicos.
type Email = string;
type CPF = string;C. Tuplas
Quando você tem um array com um número fixo de elementos e tipos conhecidos.
type Point = [number, number];D. Tipos Utilitários Complexos
Para manipulações avançadas de tipos usando condicionais ou mapeamentos.
type ReadOnly<T> = {
readonly [P in keyof T]: T[P];
};2. Quando NÃO usar Types?
- Objetos Extensíveis: Embora seja possível estender types via interseção (
&), ainterfacelida melhor com isso em termos de performance do compilador e mensagens de erro. - Bibliotecas Públicas: Se você está criando uma biblioteca, prefira
interfacepara que os usuários possam fazer declaration merging.
3. Como fazer vs Como não fazer
✅ Como fazer
- Use
typepara definir estados de UI (ex:loading | idle | error). - Use
typepara combinar interfaces existentes via interseções. - Nomeie seus types com PascalCase (ex:
AuthToken).
type ButtonVariant = 'primary' | 'secondary' | 'ghost';
type ApiResponse<T> = {
data: T;
error?: string;
};❌ Como não fazer
- NÃO use type para definir objetos simples que representam modelos de dados ou props se uma
interfacefor suficiente. - NÃO use types para criar heranças complexas que poderiam ser resolvidas de forma mais limpa com
interface extends. - NÃO tente fazer declaration merging com types; o compilador gerará um erro.
// ❌ EVITE: Usar type para algo que será estendido muitas vezes
type BaseProps = { id: string };
type ComponentProps = BaseProps & { label: string }; // Prefira interface extendsPor que isso importa?
O type é a sua ferramenta de "lógica de tipos". Usá-lo para uniões e aliases semânticos torna o código muito mais legível e seguro, evitando que strings genéricas sejam passadas onde apenas valores específicos são aceitos.