[K in keyof T] Tipos mapeados
Última atualização: 2026-10-22
[K in keyof T] Tipos mapeados
Um tipo mapeado percorre chaves e transforma valores: [K in keyof T]: boolean gera uma propriedade de mesmo nome para cada chave K de T. É a linha de montagem para mudanças de tipo em lote — a opcionalidade de Partial e a imutabilidade de Readonly são mapeamentos de uma linha.
| Grupo | Genéricos |
|---|---|
| Tipo | Sintaxe |
| Modo strict | Não necessário |
ℹ️ Info O editor transpila TypeScript para JavaScript e o executa (sem verificação de tipos); veja a Saída de cada exemplo para o resultado da verificação.
📝 Sintaxe
type BooleanFlags<T> = {
[K in keyof T]: boolean;
};
// Combinações de modificadores: readonly adiciona imutabilidade, -? remove a opcionalidade
type MyReadonly<T> = { readonly [K in keyof T]: T[K] };
type Concrete<T> = { [K in keyof T]-?: T[K] };
⚙️ Parâmetros
| [K in keyof T] | A cláusula de iteração: K vincula cada uma das chaves de T por vez |
|---|---|
| T[K] | A transformação do valor: o tipo da nova propriedade, computado livremente (boolean, T[K] | null, wrappers, ...) |
| readonly / ? / -? | Modificadores: readonly e opcionalidade podem ser adicionados ou removidos durante o mapeamento |
Retorno:Um tipo mapeado produz um novo tipo de objeto: as mesmas chaves de T (ou filtradas/renomeadas via as), com os tipos de valores transformados pela regra.
▶ Exemplo
Edite o código abaixo e clique em Testar para ver o resultado transpilado:
Saída:
{"dark":true,"beta":false,"newNav":true}
true false
(Saída de execução após a transpilação; flags.dark recebe boolean e não o literal true — o mapeamento transformou cada campo em boolean)
💡 Observações
ℹ️ Info Os embutidos Partial, Readonly, Pick e Record são todos tipos mapeados — entenda [K in keyof T] e metade do capítulo de utility types fica legível.
💡 Dica A cláusula as renomeia ou filtra chaves: { [K in keyof T as NewKey<K>]: T[K] } renomeia via template literals, as never apaga a chave — remodelação avançada de chaves e valores.
⚠️ Atenção Mapear sobre keyof T é homomórfico (modificadores preservados), mas mapear sobre uma união simples (estilo Record) descarta optional/readonly — a resposta usual para "cadê meu ?".
🏷️ Genéricos Relacionados
💡 Casos relacionados
Mais casos em breve.
📚 Tutoriais relacionados
❓ Perguntas frequentes
P Tipo mapeado vs assinatura de índice?
R Uma assinatura de índice [k: string]: T diz "toda chave é T", com chaves ilimitadas; um mapeamento [K in keyof T] copia as chaves conhecidas uma a uma, com precisão por chave. Fallback amplo vs transformação exata.
P Dá para mapear apenas algumas chaves?
R Sim: filtre com as ([K in keyof T as K extends "id" ? never : K]) ou use Pick/Omit antes de mapear. O enxugamento do conjunto de chaves acontece na cláusula as.
P Tipos mapeados podem produzir funções ou arrays?
R Sim: { [K in keyof T]: (v: T[K]) => void } produz um conjunto de callbacks; { [K in keyof T]: T[K][] } transforma cada campo em array — as transformações de valor não se limitam a tipos simples.