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.
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.
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:
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 (&):
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:
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
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.
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
Crie um alias de tipo chamado Point2D representando um ponto bidimensional com coordenadas x e y (ambos números).
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
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).
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
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.
Mostrar dica
Use a sintaxe tipo ServerConfig = { host: string; porta: número; usarHttps?: booleano; }.
Solução disponível após 3 tentativas