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

Tipos mapeados

Os tipos mapeados permitem criar novos tipos transformando as propriedades dos existentes, uma por uma. Eles são construídos sobre a sintaxe de loop sobre chaves usando o operador keyof.

TS
type Mapped<T> = {
  [P in keyof T]: T[P];
};

Este exemplo mostra um tipo mapeado idêntico ao original: ele itera sobre cada chave P em keyof T e atribui o mesmo tipo T[P].


Modificadores de mutabilidade e opcionalidade

Podemos adicionar ou remover modificadores como readonly e ? (opcionalidade) prefixando-os com + (adicionar, padrão) ou - (remover).

Por exemplo, para remover a opcionalidade de todas as propriedades de um tipo (tornando-as obrigatórias):

TS
type Concrete<T> = {
  [P in keyof T]-?: T[P];
};

O modificador -? remove o sinalizador de opcionalidade de cada propriedade.


Remapeamento de chave com as

No TypeScript 4.1+, você pode remapear chaves em um tipo mapeado usando a cláusula as e tipos literais de modelo.

TS
type WriteSetters<T> = {
  [K in keyof T as `set${Capitalize<string & K>}`]: (value: T[K]) => void;
};

Aqui estamos alterando o nome de cada propriedade K para set[CapitalizedKey] e modificando seu tipo para uma função setter.


Experimente você mesmo

Exercício 1: Tornando as propriedades anuláveis

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

Declare um tipo mapeado genérico Nullable<T> que pega um objeto T e transforma cada propriedade para que também possa aceitar o valor nulo (por exemplo, T[K] | null).

Carregando editor…
Mostrar dica

Use a sintaxe [K na chave de T]: T[K] | nulo; dentro do objeto do tipo mapeado.

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

Exercício 2: Gerando Getters Dinâmicos com as

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

Crie um tipo mapeado chamado GetterNames<T> que transforma as chaves do objeto T prefixando-as com 'get' e colocando a chave original em maiúscula (use Capitalize). Por exemplo, se uma chave for nome, ela deverá se tornar getName. Defina o tipo das propriedades como () => T[K].

Carregando editor…
Mostrar dica

Use as `get${Capitalize<string & K>}` para remapear a chave e () => T[K] como o tipo de retorno da propriedade.

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