Record<K, V>
Última atualização: 2026-10-22
Record<K, V> Record
Record<K, V> constrói um tipo de objeto com chaves K e valores V. K pode ser uma união literal (tabelas de consulta de enum) ou string/number (objetos de cache abertos). Em comparação com assinaturas de índice escritas à mão, Record declara os tipos de chave e valor uma única vez e os reutiliza em toda parte.
| Grupo | Tipos Utilitários |
|---|---|
| Tipo | Tipo |
| 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 Record<K extends string | number | symbol, V> = {
[P in K]: V;
};
// Uso
type Timeout = Record<"dev" | "staging" | "prod", number>;
type Cache = Record<string, number>;
⚙️ Parâmetros
| K | O tipo de chave: uma união literal torna cada chave obrigatória; string/number/symbol produz um conjunto de chaves aberto |
|---|---|
| V | O tipo de valor compartilhado por todas as chaves |
Retorno:Um tipo mapeado com uma entrada por membro de K, todos com o tipo V.
▶ Exemplo
Edite o código abaixo e clique em Testar para ver o resultado transpilado:
Saída:
15000 3000
128
(Saída de execução após a transpilação; Record<Env, number> exige as três chaves — omitir staging produz error TS2739)
💡 Observações
ℹ️ Info Implementação: type Record<K, V> = { [P in K]: V } — o tipo mapeado transforma cada chave de K em um V. Por isso Record<"a"|"b", number> exige tanto a quanto b.
⚠️ Atenção Record<string, V> retorna V (não V | undefined) para qualquer acesso por chave, mesmo quando a chave está ausente. No modo estrito, ativar noUncheckedIndexedAccess adiciona undefined aos resultados de acesso indexado, o que reflete melhor a realidade.
💡 Dica Para inverter chaves e valores ou derivar uma união de chaves a partir de um objeto: keyof typeof obj fornece a união de chaves, e Record<keyof typeof obj, NewValue> constrói uma tabela isomórfica — útil para mapear valores de enum a textos de exibição.
🏷️ Tipos Utilitários Relacionados
💡 Casos relacionados
Mais casos em breve.
📚 Tutoriais relacionados
❓ Perguntas frequentes
P Como Record<K, V> difere de uma assinatura de índice { [key: string]: V }?
R Com uma união literal em K, Record exige que cada chave esteja presente (uma verificação de completude) que assinaturas de índice não têm; quando K é string, os dois são equivalentes em tipos. Use Record com uma união literal quando a completude das chaves importa.
P Os valores de um Record podem diferir por chave?
R Record força um único V compartilhado. Para formatos de valor por chave, use um tipo mapeado: { [K in Env]: { url: string; retries: number } }, ou declare uma interface Config e reutilize via Record<Env, Config>.
P Devo usar um Map em vez de Record?
R Depende: chaves fixas, necessidade de serialização JSON e verificação de completude favorecem Record; chaves que crescem dinamicamente, chaves não string e adições/remoções frequentes favorecem Map<string, number>. As semânticas de tipo diferem — não os misture de forma casual.