TypeScript Tipos Intermediário
keyof e typeof
Em TypeScript, keyof e typeof são operadores de tipo que permitem derivar tipos a partir de valores e objetos existentes. keyof T produz um tipo união com todas as chaves (nomes de propriedades) de T. Já typeof valor captura o tipo inferido de uma variável, constante ou expressão, evitando repetição. Combinados, eles criam tipos dinâmicos e seguros, como keyof typeof objeto.
Um uso clássico é acessar propriedades de forma genérica: com keyof T você garante que a chave passada existe no tipo. Já typeof em contexto de tipo é diferente do typeof em tempo de execução: enquanto o primeiro gera um tipo, o segundo retorna uma string com o nome do tipo primitivo. O TypeScript resolve isso pela posição sintática.
Tipos indexados (T[K]) permitem extrair o tipo de uma propriedade específica. Por exemplo, Pessoa['nome'] é string. Isso é útil para criar funções que retornam o tipo correto com base na chave fornecida. A combinação keyof + tipos indexados forma a base de funções genéricas como get(obj, chave).
Derivar tipos de valores evita duplicação e mantém o código sincronizado. Se um objeto muda, os tipos derivados se atualizam automaticamente. Isso reduz erros e facilita a manutenção, especialmente em bases de código grandes.
Pontos-chave
keyof Tgera uma união com os nomes das propriedades deT.typeof valorem posição de tipo extrai o tipo inferido de um valor.T[K]é um tipo indexado: o tipo da propriedadeKemT.keyof typeof objcombina os dois para obter as chaves de um objeto literal.- Derivar tipos de valores evita duplicação e mantém tipos e dados sincronizados.
// Exemplo: keyof, typeof e tipos indexados
const usuario = {
id: 1,
nome: "Ana",
ativo: true,
};
// Tipo derivado do valor 'usuario'
type Usuario = typeof usuario;
// União das chaves: "id" | "nome" | "ativo"
type ChaveUsuario = keyof Usuario;
// Função genérica que acessa uma propriedade com segurança
function obterValor<T, K extends keyof T>(obj: T, chave: K): T[K] {
return obj[chave];
}
const id = obterValor(usuario, "id"); // number
const nome = obterValor(usuario, "nome"); // string
const ativo = obterValor(usuario, "ativo"); // boolean
console.log(id, nome, ativo);
// keyof typeof diretamente
function imprimirChave(chave: keyof typeof usuario) {
console.log(`Chave: ${chave}`);
}
imprimirChave("nome");
// imprimirChave("email"); // Erro: argumento não atribuível