Skip to content

Introdução a Interfaces

As interfaces são uma das características mais poderosas e utilizadas no TypeScript, permitindo a definição de contratos explícitos para a estrutura dos objetos. Elas promovem a consistência do código e ajudam a garantir que diferentes partes de um sistema interajam de maneira previsível.

Definindo e Usando Interfaces

O que é uma Interface?

Uma interface em TypeScript é uma estrutura que define a forma de um objeto. Ela descreve as propriedades e os tipos dessas propriedades que um objeto deve ter. Diferente de classes, interfaces não podem ser instanciadas ou usadas para criar objetos diretamente.

Definindo uma Interface:

A sintaxe para definir uma interface é simples e direta:

typescript
interface Pessoa {
  nome: string;
  idade: number;
  endereco?: string; // Propriedade opcional
}

Nesta interface Pessoa, qualquer objeto que implementa esta interface deve ter as propriedades nome (do tipo string) e idade (do tipo number). A propriedade endereco é opcional, indicada pelo símbolo ?.

Usando uma Interface:

Você pode usar a interface como um tipo para garantir que um objeto corresponde à forma definida pela interface:

typescript
function saudar(pessoa: Pessoa) {
  console.log(`Olá, ${pessoa.nome}! Você tem ${pessoa.idade} anos.`);
}

const usuario = {
  nome: "Maria",
  idade: 30,
  endereco: "Rua Principal, 123",
};

saudar(usuario);

Neste exemplo, a função saudar aceita um parâmetro do tipo Pessoa. Ao passar o objeto usuario para a função, o TypeScript verifica que usuario possui as propriedades necessárias para corresponder à interface Pessoa.

Extensão de Interfaces:

Interfaces podem ser estendidas para criar novas interfaces baseadas nas existentes:

typescript
interface Funcionario extends Pessoa {
  cargo: string;
}

const funcionario: Funcionario = {
  nome: "João",
  idade: 25,
  cargo: "Desenvolvedor",
};

console.log(funcionario);

A interface Funcionario estende Pessoa, adicionando a propriedade cargo.

Diferenças entre Interfaces e Tipos

No TypeScript, tanto interfaces quanto tipos (type aliases) podem ser usados para definir a forma de objetos, mas há diferenças sutis entre eles:

Interfaces:

  • Extensão: Interfaces podem ser estendidas usando a palavra-chave extends. Várias interfaces podem ser combinadas para criar uma nova interface.
  • Implementação em Classes: Classes podem implementar interfaces, garantindo que sigam um contrato específico.
  • Merger de Interfaces: Se duas interfaces com o mesmo nome são declaradas no mesmo escopo, o TypeScript irá mesclá-las automaticamente.

Exemplo de interface:

typescript
interface A {
  prop1: string;
}

interface A {
  prop2: number;
}

const obj: A = {
  prop1: "hello",
  prop2: 42,
};

Tipos (Type Aliases):

  • Flexibilidade: Tipos podem usar union e intersection para combinar múltiplos tipos.
  • Tipos Primitivos e Complexos: Tipos podem definir não apenas objetos, mas também primitivas, funções, arrays, etc.
  • Extensão via Interseção: Extensões de tipos são feitas usando interseções (&), não extends.

Exemplo de type alias:

typescript
type B = {
  prop1: string;
};

type C = B & {
  prop2: number;
};

const objC: C = {
  prop1: "hello",
  prop2: 42,
};

Quando Usar Cada Um:

  • Interfaces: Use interfaces quando você precisa de uma estrutura que será estendida ou implementada por classes, ou quando você precisa que o compilador faça a mesclagem automática de declarações de interfaces.
  • Tipos: Use type aliases para definições mais flexíveis, incluindo combinações complexas de tipos e quando você precisar usar funcionalidades como unions.

Em resumo, tanto interfaces quanto type aliases são ferramentas poderosas no TypeScript que ajudam a definir a estrutura dos dados e a garantir a segurança dos tipos. A escolha entre um e outro depende do contexto e das necessidades específicas do seu projeto.