Interfaces

Interfaces em TypeScript são contratos que definem a estrutura de objetos, especificando propriedades e métodos que devem estar presentes. Elas ajudam a garantir a consistência e segurança de tipos em variáveis, parâmetros e retornos de funções, favorecendo a organização do código.

Declaração de Interfaces

Uma interface é criada com a palavra-chave interface. Ela pode incluir tipos primitivos, arrays, funções e propriedades opcionais.

interface Pessoa {
nome: string;
idade: number;
apresentar(): void;
}

Qualquer objeto ou classe que implementa Pessoa deve respeitar esta estrutura.

Utilizando Interfaces com Objetos

Objetos que sigam a “assinatura” são considerados compatíveis com a interface:

const autor: Pessoa = {
nome: "Carlos",
idade: 33,
apresentar() {
console.log(`Meu nome é ${this.nome}`);
}
};
autor.apresentar();

Qualquer objeto que defina nome, idade e o método apresentar será aceito como Pessoa.

Implementando Interfaces em Classes

Classes podem implementar interfaces, obrigando a definição das propriedades e métodos requisitados:

class Aluno implements Pessoa {
nome: string;
idade: number;
constructor(nome: string, idade: number) {
this.nome = nome;
this.idade = idade;
}
apresentar() {
console.log(`Sou o aluno ${this.nome}`);
}
}

A classe Aluno precisa fornecer todas as definições de Pessoa, caso contrário, o compilador mostrará erro.

Propriedades e Métodos Opcionais

O sinal de interrogação (?) indica propriedades ou métodos que podem ser omitidos:

interface Livro {
titulo: string;
autor?: string;
resumo?(): void;
}

const livro1: Livro = { titulo: "1984" };

Neste exemplo, autor e resumo são opcionais.

Interfaces com Funções e Tipos de Objetos

Interfaces também podem descrever funções:

interface Operacao {
(a: number, b: number): number;
}
const soma: Operacao = (x, y) => x + y;

Este padrão define o formato que uma função precisa seguir para ser considerada do tipo Operacao.

Extensão de Interfaces

Uma interface pode estender outra, herdando características:

interface Pessoa {
nome: string;
}
interface Funcionário extends Pessoa {
cargo: string;
}

const gerente: Funcionário = { nome: "Ana", cargo: "Gestora" };

Funcionário traz todas as propriedades de Pessoa além das suas próprias.

Interfaces Genéricas

Interfaces podem ser genéricas, aceitando tipos como parâmetros:

interface Par<T, U> {
primeiro: T;
segundo: U;
}
const exemplo: Par<string, number> = { primeiro: "id", segundo: 15 };

Isso permite muito mais flexibilidade na definição de tipos.

Resumo

  • Interfaces criam contratos de tipos para objetos, funções e classes.
  • Permitem herança e uso de propriedades/métodos opcionais.
  • Facilitam a manutenção, reutilização e clareza do código, sendo parte central do suporte a tipagem estática no TypeScript.