Pular para o conteúdo principal
Módulo 4 · Lição 2 de 28/14 no curso~15 min
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:

TS
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:

TS
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 property

3. Pick<T, Keys>

Cria um tipo selecionando apenas um conjunto específico de chaves (representado por uma união de string) do tipo T:

TS
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:

TS
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):

TS
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

Exercício#ts.m4.l2.e1
Tentativas: 0Carregando…

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.

Carregando editor…
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

Exercício#ts.m4.l2.e2
Tentativas: 0Carregando…

Dado o tipo UserAccount, defina um alias de tipo chamado SafeUser que omite a propriedade confidencial passwordHash.

Carregando editor…
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

Exercício#ts.m4.l2.e3
Tentativas: 0Carregando…

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.

Carregando editor…
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

Exercício#ts.m4.l2.e4
Tentativas: 0Carregando…

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.

Carregando editor…
Mostrar dica

Use Readonly<User> para definir ReadOnlyUser e Record<string, ReadOnlyUser> para o registro.

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