Da trilha de TypeScript Este conceito ainda não saiu como card do dia. ir para o card de hoje

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 T gera uma união com os nomes das propriedades de T.
  • typeof valor em posição de tipo extrai o tipo inferido de um valor.
  • T[K] é um tipo indexado: o tipo da propriedade K em T.
  • keyof typeof obj combina os dois para obter as chaves de um objeto literal.
  • Derivar tipos de valores evita duplicação e mantém tipos e dados sincronizados.
keyof_typeof.ts
// 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

Exercícios

  1. 1
    Fácil

    Chaves de um objeto

    Dado o objeto config abaixo, crie um tipo ConfigKey que seja a união de suas chaves usando keyof typeof. Depois, escreva uma função mostrarChave que recebe uma ConfigKey e imprime "Chave: <chave>".

    Resolver
  2. 2
    Médio

    Acessor genérico com tipos indexados

    Implemente uma função genérica pegar que recebe um objeto obj e uma chave chave (do tipo keyof T) e retorna o valor correspondente com o tipo correto (T[K]). Use o objeto produto para testar e imprima os valores retornados.

    Resolver
  3. 3
    Desafio

    Validador de campos com keyof e typeof

    Crie um objeto formulario com campos nome (string), idade (number) e email (string). Implemente uma função validarCampo que recebe o objeto, uma chave e uma função de validação específica para o tipo daquele campo. A função deve retornar true se o valor passar na validação. Use tipos genéricos e indexados para garantir que a função de validação receba o tipo correto. Teste com três campos e imprima os resultados.

    Resolver

Continue estudando