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.
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):
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.
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
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).
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
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].
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