typexinterfacexclasse
No TypeScript, interface, type, e class são três construções importantes para trabalhar com tipos e modelagem de dados. Embora possam parecer semelhantes, têm diferenças significativas em termos de uso, propósito e comportamento.
1. Interface
Uma interface no TypeScript é usada para definir a estrutura de um objeto ou contrato. Ela especifica quais propriedades e métodos um objeto deve ter.
Características:
- Define um contrato para objetos, mas não gera código JavaScript.
- Suporta herança através de
extends. - Pode ser implementada por uma classe com a palavra-chave
implements.
Exemplo:
interface User {
name: string;
email: string;
active: boolean;
}
const user: User = {
name: "John",
email: "john@example.com",
active: true,
};
Quando usar:
- Quando você deseja descrever a forma de um objeto e manter a flexibilidade de extensão para contratos.
2. Type
Um type (alias de tipo) é usado para criar um nome para um tipo mais complexo. Ele é mais flexível do que uma interface, podendo representar tipos primitivos, uniões, interseções, etc.
Características:
- Pode descrever objetos, funções, uniões (
|), interseções (&), ou até mesmo tipos primitivos. - Não suporta herança como
extends, mas suporta interseções para composição. - Pode ser mais sucinto e versátil do que uma interface.
Exemplo:
type User = {
name: string;
email: string;
active: boolean;
};
const user: User = {
name: "Jane",
email: "jane@example.com",
active: true,
};
Quando usar:
- Quando você precisa de flexibilidade extra, como uniões, interseções ou tipos complexos.
- Para tipos mais simples ou ad hoc.
Diferenças entre interface e type
| Aspecto | Interface | Type |
|---|---|---|
| Herança | Suporta extends para herdar outra interface. | Suporta interseções (&) para combinar tipos. |
| Tipos Primitivos | Não pode representar tipos primitivos diretamente. | Pode representar tipos primitivos (e.g., type ID = string;). |
| União de Tipos | Não suportado diretamente. | Suportado (e.g., `type Status = 'active' |
| Extensibilidade | Pode ser extendida com múltiplas declarações. | Não pode ser redefinida após a declaração. |
| Propósito | Melhor para contratos e forma de objetos. | Melhor para tipos complexos e flexíveis. |
3. Class
Uma classe no TypeScript é uma construção que combina tanto estrutura (como interfaces) quanto comportamento (métodos, lógica, etc.). Ela é transpilada para código JavaScript (ES6 ou inferior).
Características:
- Define um modelo para criar objetos.
- Pode incluir propriedades e métodos.
- Pode implementar interfaces e estender outras classes.
- É usada para lógica de negócio, além de apenas modelar dados.
Exemplo:
class User {
constructor(
public name: string,
public email: string,
public active: boolean
) {}
deactivate() {
this.active = false;
}
}
const user = new User("Alice", "alice@example.com", true);
user.deactivate();
console.log(user);
Quando usar:
- Quando você precisa combinar dados e lógica.
- Quando precisa criar objetos com comportamento (métodos).
Diferenças entre class, interface e type
| Aspecto | Class | Interface | Type |
|---|---|---|---|
| Transpilação | Gera código JavaScript. | Não gera código JavaScript. | Não gera código JavaScript. |
| Comportamento | Pode conter lógica (métodos). | Não pode conter lógica. | Não pode conter lógica. |
| Uso como Contrato | Pode implementar interfaces. | Define contratos para objetos e classes. | Define contratos, mas sem herança direta. |
| Reutilização | Suporta herança e implementação. | Suporta extends para compor contratos. | Suporta interseções (&) para combinar tipos. |
| Exemplo de Lógica | Pode adicionar métodos diretamente. | Apenas define a forma, sem lógica. | Apenas define a forma, sem lógica. |
Quando usar cada um?
-
Interface:
- Se você está definindo contratos para objetos ou deseja usar polimorfismo com classes que implementam contratos.
- Melhor para modelar objetos estáticos.
-
Type:
- Se precisa de mais flexibilidade para criar uniões, interseções, ou representar tipos complexos.
- Melhor para tipos dinâmicos ou combinados.
-
Class:
- Se você precisa modelar dados e adicionar comportamento (métodos, lógica de negócio).
- Melhor para trabalhar com POO (Programação Orientada a Objetos).
Conclusão
- Interfaces e types são usadas para modelar a estrutura de dados, mas types são mais flexíveis e suportam tipos complexos.
- Classes são usadas quando você precisa de objetos com comportamento e lógica.
- Escolha interfaces para contratos, types para flexibilidade, e classes para objetos dinâmicos com comportamento.