Aula 04 – Interfaces e Modelagem de Domínio 🏗️
Objetivo
Nesta aula, aprenderemos a modelar objetos complexos usando Interfaces. Entenderemos a diferença entre interface e type e como construir contratos sólidos para aplicações corporativas.
1. O que são Interfaces? 📜
Uma Interface é um contrato que define a estrutura de um objeto. Ela diz quais propriedades e métodos um objeto deve ter, mas não como eles são implementados.
interface Livro {
titulo: string;
autor: string;
paginas?: number; // Propriedade opcional
readonly isbn: string; // Propriedade apenas de leitura
}
const meuLivro: Livro = {
titulo: "Clean Code",
autor: "Robert C. Martin",
isbn: "123-456-789"
};
2. Extensão de Interfaces (Herança de Contratos) 🧬
Podemos combinar interfaces para criar estruturas mais complexas e reutilizáveis.
interface Animal {
nome: string;
}
interface Mamifero extends Animal {
amamentar(): void;
}
const cachorro: Mamifero = {
nome: "Rex",
amamentar: () => console.log("Amamentando...")
};
3. Implementação em Classes 🏛️
As interfaces são fundamentais na Programação Orientada a Objetos (POO). Uma classe pode "assinar" um contrato de interface usando a palavra-chave implements.
interface Autenticavel {
login(): boolean;
}
class Usuario implements Autenticavel {
login(): boolean {
console.log("Usuário logado!");
return true;
}
}
4. Diferença entre Interface e Type Alias ⚖️
Ambos são muito parecidos, mas existem diferenças fundamentais:
| Característica | Interface | Type Alias |
|---|---|---|
| Extensibilidade | Pode ser estendida via extends. |
Pode ser combinada via interseção (&). |
| Declaration Merging | Se você definir duas com o mesmo nome, elas se fundem. | Não permite nomes duplicados. |
| Ideal para | Modelagem de objetos e POO. | Uniões, Primitivos, Funções e Tipos complexos. |
Dica Profissional
A recomendação oficial do TypeScript é: use Interface até que você precise de uma funcionalidade específica do Type.
5. Modelagem de Domínio (Entidades) 🗺️
Modelar o domínio é definir as "regras de negócio" através dos tipos. Em um e-commerce, teríamos:
Visualizando o Domínio (Mermaid)
classDiagram
class Produto {
+number id
+string nome
+number preco
}
class Cliente {
+string email
+string endereco
}
class Pedido {
+Produto[] itens
+Cliente cliente
+total() number
}
Pedido o-- Produto : contém
Pedido o-- Cliente : pertence a
6. Exercícios Práticos 📝
- Básico: Crie uma interface
Funcionariocom propriedadesnome,salarioe uma propriedade opcionalbonus. - Básico: Crie uma interface
Veiculoe useextendspara criar uma interfaceMoto. - Intermediário: Tente usar o "Declaration Merging" criando duas interfaces
Usuarioem partes diferentes do código e veja como o TS as une. - Intermediário: Crie uma interface para uma função que recebe dois números e retorna a soma deles.
- Desafio: Modele um sistema de biblioteca. Crie interfaces para
Autor,LivroeEmprestimo. Garanta que um empréstimo tenha uma data de início e uma data de devolução.
🚀 Mini-Projeto da Aula
Modele as entidades de um Sistema de Gestão Acadêmica.
- Interfaces para: Aluno, Professor, Disciplina e Turma.
- Uma turma deve conter um professor e uma lista de alunos.
- Utilize propriedades readonly para IDs que não podem ser alterados.
Próxima Aula: Vamos subir o nível com Classes e Programação Orientada a Objetos no TypeScript!