Pular para o conteúdo
TypeScript

Type vs Interface no TypeScript

Type e interface no TypeScript: união, merge e quando cada um encaixa no dia a dia.

Por que isso é importante

Type vs interface no TypeScript: interface mergeia declaração; type brilha em união e mapped types. Não são iguais — escolha pelo caso, não por dogma.

O Que São Type e Interface no TypeScript

Galera, vamos direto ao ponto. Tanto type quanto interface servem pra definir o formato de dados no TypeScript. Parecem gêmeos, mas têm personalidades bem diferentes.

Interface nasceu pra descrever a forma de objetos. Pensa nela como um contrato: 'esse objeto precisa ter esses campos'. Type alias é mais versátil. Dá pra representar objetos, unions, intersections, primitivos, tuplas e muito mais.

Na prática, a grande sacada é: interface é aberta (pode ser estendida depois) e type é fechado (uma vez definido, não muda). Isso muda completamente como você organiza código em projetos grandes.

O TypeScript trata os dois de forma parecida na compilação, mas cada um tem superpoderes próprios. Entender onde cada um brilha é o que separa o dev que chuta do dev que decide com confiança.

Como Decidir entre Type e Interface Passo a Passo

Não precisa decorar regra. Segue esse fluxo e você acerta em 95% dos casos:

  1. Passo 1: Está descrevendo a forma de um objeto? Use interface. Ela foi feita pra isso e tem syntax mais limpa.
  2. Passo 2: Precisa de union type (valor A ou B)? Vá de type. Interface não faz union.
  3. Passo 3: Quer que outros arquivos estendam sua definição depois? interface com declaration merging resolve.
  4. Passo 4: Precisa combinar tipos complexos com intersection (&)? type é mais natural aqui.
  5. Passo 5: Trabalha com tuplas, mapped types ou conditional types? Só type dá conta.
  6. Passo 6: Na dúvida real? Comece com interface pra objetos e type pro resto. Simples assim.

Exemplos Práticos

Vamos ver código de verdade. Primeiro, a syntax básica de cada um:

// Interface - descreve objetos
interface User {
  name: string;
  age: number;
  email: string;
}

// Type alias - descreve qualquer tipo
type UserType = {
  name: string;
  age: number;
  email: string;
};

// Até aqui, fazem a mesma coisa
const user1: User = { name: "Ana", age: 28, email: "ana@dev.com" };
const user2: UserType = { name: "Ana", age: 28, email: "ana@dev.com" };

Agora, onde interface brilha: extending e declaration merging.

// Extending com interface (extends)
interface Animal {
  name: string;
}

interface Dog extends Animal {
  breed: string;
}

// Declaration merging - só interface faz isso
interface Config {
  apiUrl: string;
}

interface Config {
  timeout: number;
}

// Config agora tem apiUrl E timeout
const config: Config = { apiUrl: "https://api.com", timeout: 5000 };

E onde type manda: unions, intersections, tuplas e tipos complexos.

// Union types - só type faz
type Status = "loading" | "success" | "error";
type ID = string | number;

// Intersection com type (&)
type Admin = User & { role: "admin" };

// Tupla - só type
type Coordinate = [number, number];

// Mapped types - só type
type ReadonlyUser = {
  readonly [K in keyof User]: User[K];
};

// Conditional types - só type
type IsString = T extends string ? "sim" : "nao";

Resumo rápido: interface pra objetos e contratos. Type pra todo o resto. Em projetos reais, você vai usar os dois juntos sem problema.

Erros Comuns

Cuidado com esses deslizes

Erro 1: Usar interface pra union types. Interface NÃO suporta union. Se você precisa de 'string | number', vai de type.

Erro 2: Abusar de declaration merging sem querer. Se você definir a mesma interface duas vezes no mesmo escopo, o TypeScript junta as duas automaticamente. Isso pode criar campos fantasma que você nem sabe que existem.

Erro 3: Achar que type é sempre melhor por ser mais flexível. Em projetos com muitas bibliotecas, interface facilita a extensão de tipos de terceiros via declaration merging.

Erro 4: Misturar extends com & sem critério. Interface usa extends, type usa &. Combinar os dois funciona, mas fica confuso pra quem lê o código depois.

Erro 5: Ignorar performance. Em projetos muito grandes, interface tende a performar melhor na checagem de tipos porque o compilador cacheia interfaces de forma mais eficiente.

Checklist: Type vs Interface

  • Usei interface pra descrever objetos e classes.
  • Usei type pra unions, tuplas e tipos complexos.
  • Verifiquei se declaration merging não criou campos inesperados.
  • Mantive consistência dentro do mesmo projeto (não misturei sem critério).
  • Documentei a escolha quando não era óbvia pra outros devs do time.
  • Testei que a tipagem está correta compilando sem erros.

Domine TypeScript na prática

Saber a diferença entre type e interface é só o começo. No CrazyStack, você usa TypeScript em um projeto real completo: API em Node.js, frontend em React, autenticação, pagamentos, deploy. Tudo tipado do zero.

Chega de ficar só na teoria. Você termina o curso com um SaaS pronto pra colocar no ar e começar a faturar. É o projeto que todo dev queria ter no portfólio.

Perguntas frequentes

O Que São Type e Interface no TypeScript

Galera, vamos direto ao ponto. Tanto type quanto interface servem pra definir o formato de dados no TypeScript. Parecem gêmeos, mas têm personalidades bem diferentes. Interface nasceu pra descrever a forma de objetos. Pensa nela como um contrato: 'esse objeto precisa ter esses campos'. Type alias é mais versátil. Dá pra representar objetos, unions, intersections, primitivos, tuplas e muito mais. Na prática, a grande sacada é: interface é aberta (pode ser estendida depois) e type é fechado (uma vez definido, não muda). Isso muda completamente como você organiza código em projetos grandes.

Como Decidir entre Type e Interface Passo a Passo

Não precisa decorar regra. Segue esse fluxo e você acerta em 95% dos casos: