Pular para o conteúdo principal
Módulo 2 · Lição 1 de 23/14 no curso~12 min
Lições do módulo (1/2)

Aliases de tipo versus interfaces

No TypeScript, podemos definir a estrutura de objetos complexos de duas maneiras principais: usando Interfaces (interface) ou Apelidos de tipo (type). Ambos servem para descrever a "forma" de um objeto ou estrutura de dados, mas apresentam algumas diferenças fundamentais.


Interfaces (interface)

Uma interface define um contrato para a estrutura de um objeto. É a ferramenta padrão para descrever formas de objetos e APIs públicas de forma extensível.

TS
interface Book {
  title: string;
  pages: number;
  author?: string; // Optional property (can be omitted)
}

const myBook: Book = {
  title: 'The Lord of the Rings',
  pages: 1200,
};

O ponto de interrogação (?) marca uma propriedade como opcional. O objeto myBook é válido mesmo se omitir a propriedade author.


Aliases de tipo (type)

Um alias de tipo permite associar um novo nome a qualquer tipo existente, incluindo tipos primitivos, uniões, tuplas ou estruturas de objetos inteiras.

TS
type Point = {
  x: number;
  y: number;
};

const coordinates: Point = { x: 10, y: 20 };

Principais diferenças: fusão de extensão e declaração

Embora interface e type sejam intercambiáveis ​​para a maioria dos casos de uso comuns, eles apresentam duas diferenças críticas:

1. Extensibilidade (herança)

As interfaces são estendidas usando a palavra-chave extends:

TS
interface User {
  username: string;
}

interface Admin extends User {
  privileges: string[];
}

Os aliases de tipo não podem ser estendidos usando extends, mas podem ser combinados usando o operador intersection (&):

TS
type User = {
  username: string;
};

type Admin = User & {
  privileges: string[];
};

2. Fusão de declarações

Várias interfaces com o mesmo nome no mesmo escopo são mescladas automaticamente pelo compilador:

TS
interface User {
  name: string;
}
interface User {
  email: string;
}
// Now User has both 'name' and 'email'!

Este comportamento não é suportado por aliases de tipo: declarar o mesmo type duas vezes irá acionar um erro em tempo de compilação.


Experimente você mesmo

Exercício 1: Interface do usuário

Exercício#ts.m2.l1.e1
Tentativas: 0Carregando…

Defina uma interface chamada User que descreva um objeto de usuário. A interface deve conter: id como número, nome de usuário como string e email como string opcional.

Carregando editor…
Mostrar dica

Use a sintaxe email?: string para marcá-lo como opcional.

Solução disponível após 3 tentativas

Exercício 2: Alias ​​do tipo Point2D

Exercício#ts.m2.l1.e2
Tentativas: 0Carregando…

Crie um alias de tipo chamado Point2D representando um ponto bidimensional com coordenadas x e y (ambos números).

Carregando editor…
Mostrar dica

Use o tipo de sintaxe Point2D = { x: number; y: número; };

Solução disponível após 3 tentativas

Exercício 3: Estendendo Interfaces

Exercício#ts.m2.l1.e3
Tentativas: 0Carregando…

Defina uma interface chamada Produto com id (número) e preço (número). Em seguida, defina uma interface chamada DiscountedProduct que estenda Product e adicione uma propriedade opcional chamada DiscountCode (string).

Carregando editor…
Mostrar dica

Use estende Produto para herdar os campos e adicione descontoCode?: string.

Solução disponível após 3 tentativas

Exercício 4: Configuração do Servidor

Exercício#ts.m2.l1.e4
Tentativas: 0Carregando…

Defina um alias de tipo denominado ServerConfig representando um objeto de configuração para um servidor. Deve conter: host (string), porta (número) e useHttps como campo booleano opcional.

Carregando editor…
Mostrar dica

Use a sintaxe tipo ServerConfig = { host: string; porta: número; usarHttps?: booleano; }.

Solução disponível após 3 tentativas