[Medium] Interface vs Type Alias
1. What are Interface and Type Alias?
O que são Interface e Type Alias?
Interface
Definição: Usada para definir a estrutura de um objeto, descrevendo quais propriedades e métodos o objeto deve ter.
interface User {
name: string;
age: number;
email?: string; // propriedade opcional
}
const user: User = {
name: 'John',
age: 30,
};
Type Alias (Alias de tipo)
Definição: Cria um alias para um tipo, que pode ser usado com qualquer tipo, não apenas objetos.
type User = {
name: string;
age: number;
email?: string;
};
const user: User = {
name: 'John',
age: 30,
};
2. Interface vs Type Alias: Key Differences
Principais diferenças entre Interface e Type Alias
1. Método de extensão
Interface: usando extends
interface Animal { name: string; }
interface Dog extends Animal { breed: string; }
const dog: Dog = { name: 'Buddy', breed: 'Golden Retriever' };
Type Alias: usando tipo de interseção
type Animal = { name: string; };
type Dog = Animal & { breed: string; };
const dog: Dog = { name: 'Buddy', breed: 'Golden Retriever' };
2. Fusão (Declaration Merging)
Interface: suporta fusão
interface User { name: string; }
interface User { age: number; }
// Automaticamente fundido em { name: string; age: number; }
const user: User = { name: 'John', age: 30 };
Type Alias: não suporta fusão
type User = { name: string; };
type User = { age: number; }; // ❌ Erro: Duplicate identifier 'User'
3. Escopo de aplicação
Interface: principalmente para estruturas de objetos
interface User { name: string; age: number; }
Type Alias: utilizável com qualquer tipo
type ID = string | number;
type Greet = (name: string) => string;
type Status = 'active' | 'inactive' | 'pending';
type Point = [number, number];
type User = { name: string; age: number; };
4. Propriedades computadas
Interface: não suporta propriedades computadas
interface User { [key: string]: any; }
Type Alias: suporta operações de tipo mais complexas
type Keys = 'name' | 'age' | 'email';
type User = { [K in Keys]: string; };
3. When to Use Interface vs Type Alias?
Quando usar Interface? Quando usar Type Alias?
Usar Interface quando
- Definir estruturas de objetos (mais comum)
- Fusão de declarações é necessária (ex. estender tipos de pacotes de terceiros)
- Definir contratos de classe
Usar Type Alias quando
- Definir tipos union ou interseção:
type ID = string | number; - Definir tipos de função:
type EventHandler = (event: Event) => void; - Definir tuplas:
type Point = [number, number]; - Tipos mapeados ou condicionais são necessários
4. Common Interview Questions
Perguntas comuns em entrevistas
Pergunta 1: Diferenças básicas
Explique as diferenças entre as duas formas de definição a seguir.
interface User { name: string; age: number; }
type User = { name: string; age: number; };
Clique para ver a resposta
Semelhanças: Ambos podem definir estruturas de objetos, usam-se da mesma forma, ambos podem ser estendidos.
Diferenças:
- Fusão de declarações: Interface suporta; Type Alias não.
- Escopo: Interface é principalmente para objetos; Type Alias para qualquer tipo.
Recomendação: Para estruturas de objetos, ambos servem. Para fusão de declarações, use Interface. Para tipos não-objeto, use Type Alias.
Pergunta 2: Métodos de extensão
Explique as diferenças entre extends e interseção &.
Clique para ver a resposta
- Sintaxe: Interface usa
extends, Type usa& - Resultado: Ambos produzem o mesmo resultado
- Legibilidade:
extendsde Interface é mais intuitivo - Flexibilidade:
&de Type pode combinar múltiplos tipos
Pergunta 3: Fusão de declarações
interface User { name: string; }
interface User { age: number; }
const user: User = { name: 'John' }; // Falta age?
Clique para ver a resposta
As duas declarações são automaticamente fundidas. A falta de age gera um erro. Type Alias não suporta fusão de declarações.
Pergunta 4: Implementação (implements)
Clique para ver a resposta
Ambos podem ser usados com implements. Interface é mais comum para contratos de classe. Type Alias de funções não pode ser implementado.
5. Best Practices
Melhores práticas
Práticas recomendadas
// 1. Para objetos, preferir Interface
interface User { name: string; age: number; }
// 2. Para tipos union, usar Type Alias
type Status = 'active' | 'inactive' | 'pending';
// 3. Para tipos de função, usar Type Alias
type EventHandler = (event: Event) => void;
// 4. Para fusão de declarações, usar Interface
interface Window { customProperty: string; }
// 5. Para contratos de classe, usar Interface
interface Flyable { fly(): void; }
class Bird implements Flyable { fly(): void {} }
Práticas a evitar
// 1. Não misturar Interface e Type Alias para a mesma estrutura
// 2. Não usar Type Alias para objetos simples (Interface é mais apropriado)
// 3. Não usar Interface para tipos não-objeto
6. Interview Summary
Resumo para entrevistas
Referência rápida
Interface: objetos, Declaration Merging, extends, contratos de classe.
Type Alias: qualquer tipo, sem Declaration Merging, & interseção, union/função/tupla.
Exemplos de respostas para entrevistas
Q: Quais são as diferenças entre Interface e Type Alias?
"Interface e Type Alias podem ser usados para definir estruturas de objetos, mas têm diferenças chave: 1) Interface suporta fusão de declarações; Type Alias não. 2) Interface é para objetos; Type Alias para qualquer tipo. 3) Interface usa extends; Type Alias usa &. 4) Interface é melhor para contratos de classe. Para objetos, ambos servem. Para fusão, use Interface. Para tipos não-objeto, use Type Alias."
Q: Quando usar Interface é quando Type Alias?
"Use Interface para: estruturas de objetos, fusão de declarações, contratos de classe. Use Type Alias para: tipos union/interseção, tipos de função, tuplas, tipos mapeados/condicionais. Em resumo, prefira Interface para objetos e Type Alias para o resto."