Lições do módulo (2/2)
Tipos de utilitários
TypeScript fornece vários tipos de utilitários globais para facilitar transformações de tipos comuns. Esses tipos são genéricos e permitem construir declarativamente novos tipos a partir dos existentes.
Os quatro tipos de utilitários mais comumente usados são:
1. Partial<T>
Torna todas as propriedades de um tipo T opcionais. Isso é extremamente útil para funções de atualização/patch onde o chamador pode fornecer apenas um subconjunto de campos:
interface User {
id: number;
name: string;
email: string;
}
// All properties of User become optional: { id?: number; name?: string; email?: string; }
type UserUpdate = Partial<User>;2. Readonly<T>
Torna todas as propriedades de um tipo T somente leitura. Qualquer tentativa de reatribuir uma propriedade acionará um erro do compilador em tempo de compilação:
interface Point {
x: number;
y: number;
}
const p: Readonly<Point> = { x: 10, y: 20 };
// p.x = 5; // Error: cannot assign to 'x' because it is a read-only property3. Pick<T, Keys>
Cria um tipo selecionando apenas um conjunto específico de chaves (representado por uma união de string) do tipo T:
interface Article {
id: number;
title: string;
content: string;
views: number;
}
// Selects only 'title' and 'views': { title: string; views: number; }
type ArticlePreview = Pick<Article, 'title' | 'views'>;4. Omit<T, Keys>
Cria um tipo removendo um conjunto específico de chaves do tipo T. É o dual de Pick:
interface Product {
id: number;
name: string;
price: number;
secretVendorCode: string;
}
// Removes 'secretVendorCode': { id: number; name: string; price: number; }
type PublicProduct = Omit<Product, 'secretVendorCode'>;5. Record<Keys, Type>
Cria um tipo de objeto cujas chaves de propriedade são Keys e cujos valores de propriedade são Type. É extremamente útil para mapear chaves para valores, representando dicionários ou tabelas hash (mapas de valores-chave):
type Page = 'home' | 'about' | 'contact';
interface PageInfo {
title: string;
}
// Creates a dictionary with keys 'home' | 'about' | 'contact' and values PageInfo
const nav: Record<Page, PageInfo> = {
home: { title: 'Home Page' },
about: { title: 'About Us' },
contact: { title: 'Contact Us' },
};Experimente você mesmo
Exercício 1: Atualização de Perfil com Parcial
Complete a função updateProfile que aceita um perfil original (Profile) e um objeto de atualizações (updates) onde todos os campos do Profile são opcionais. Deve retornar um novo objeto Profile combinando as propriedades originais com as atualizações.
Mostrar dica
Use o tipo de utilitário Partial<Profile> para o parâmetro de atualizações e o operador spread para mesclar os objetos: { ...original, ...updates }.
Solução disponível após 3 tentativas
Exercício 2: Removendo Campos Sensíveis com Omitir
Dado o tipo UserAccount, defina um alias de tipo chamado SafeUser que omite a propriedade confidencial passwordHash.
Mostrar dica
Use o tipo SafeUser = Omit<UserAccount, 'passwordHash'>; para omitir o campo especificado.
Solução disponível após 3 tentativas
Exercício 3: Configuração pública com Pick e Readonly
Dado o tipo AppConfig, defina um alias de tipo chamado PublicConfig que seja uma versão somente leitura (Readonly) contendo apenas as propriedades apiEndpoint e port selecionadas usando Pick.
Mostrar dica
Use o tipo PublicConfig = Readonly<Pick<AppConfig, 'apiEndpoint' | 'porta'>>;
Solução disponível após 3 tentativas
Exercício 4: Registro de usuário com registro e somente leitura
Dada uma interface de usuário com campos id: número e nome: string, crie um tipo ReadOnlyUser que torne todos os campos do usuário somente leitura. Em seguida, crie um tipo UserRegistry que represente um dicionário onde a chave é uma string (por exemplo, string id) e o valor é ReadOnlyUser.
Mostrar dica
Use Readonly<User> para definir ReadOnlyUser e Record<string, ReadOnlyUser> para o registro.
Solução disponível após 3 tentativas