Aparência
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
eintersection
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ãoextends
.
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.