Typeof e Keyof | Typescript
- Typeof e Keyof | Typescript
Introdução
No TypeScript, os operadores keyof e typeof são ferramentas poderosas para trabalhar com tipos dinâmicos e extração de informações de objetos. Eles são fundamentais para escrever código genérico e seguro em relação a tipos, especialmente ao lidar com interfaces, tipos derivados e funções utilitárias.
1. O operador typeof
Conceito
O operador typeof em TypeScript serve para obter o tipo de uma variável ou valor existente.
É diferente do typeof do JavaScript em tempo de execução — no TypeScript, ele atua em tempo de compilação, permitindo reutilizar tipos existentes.
Exemplo básico
const user = {
name: "Ana",
age: 30,
};
// Criamos um tipo baseado no objeto 'user'
type User = typeof user;
// O mesmo que:
// type User = {
// name: string;
// age: number;
// };
Agora o tipo User tem a mesma estrutura do objeto user.
2. O operador keyof
Conceito
O operador keyof cria um tipo literal de união com todas as chaves (keys) de um tipo ou interface.
Ele é útil para garantir que você só use propriedades válidas de um objeto em tipos e funções.
Exemplo básico
interface User {
name: string;
age: number;
}
type UserKeys = keyof User;
// Resultado: "name" | "age"
Ou seja, UserKeys é um tipo que pode ser "name" ou "age".
3. Combinando keyof e typeof
Esses operadores se tornam especialmente poderosos quando usados juntos.
Exemplo prático
const colors = {
primary: "#0000FF",
secondary: "#00FF00",
danger: "#FF0000",
};
type ColorKeys = keyof typeof colors;
// Resultado: "primary" | "secondary" | "danger"
Aqui:
typeof colorscria um tipo com base no objeto.keyof typeof colorscria um tipo literal com as chaves desse objeto.
Isso é muito útil para criar funções genéricas seguras:
function getColor(key: keyof typeof colors) {
return colors[key];
}
getColor("primary"); // ✅ funciona
getColor("unknown"); // ❌ erro de compilação
4. Exemplo mais avançado: acesso dinâmico com segurança de tipos
const user = {
name: "Carlos",
age: 25,
active: true,
};
function getValue<T extends object, K extends keyof T>(obj: T, key: K): T[K] {
return obj[key];
}
const nameValue = getValue(user, "name"); // string
const ageValue = getValue(user, "age"); // number
Aqui, o TypeScript sabe que getValue(user, "name") retorna uma string e getValue(user, "age") retorna um number.
5. Quando usar keyof e typeof
| Caso de uso | Operador |
|---|---|
| Criar tipos baseados em objetos existentes | typeof |
| Obter as chaves de um tipo | keyof |
| Garantir acesso seguro a propriedades | keyof typeof |
| Criar funções genéricas que aceitam apenas propriedades válidas | keyof (com genéricos) |
6. Resumo visual
const obj = { a: 1, b: 2 };
// typeof → extrai o tipo do objeto
type T = typeof obj; // { a: number; b: number; }
// keyof → extrai as chaves do tipo
type K = keyof T; // "a" | "b"
// keyof typeof → extrai as chaves diretamente do objeto
type KK = keyof typeof obj; // "a" | "b"