Esses dois operadores permitem que você derive tipos de tipos e valores existentes — a fundação da programação em nível de tipo.
keyof — a união das chaves de um tipo de objeto
interface User { id: number; name: ; }
= keyof ;
Esses dois operadores permitem que você derive tipos de tipos e valores existentes — a fundação da programação em nível de tipo.
interface User { id: number; name: ; }
= keyof ;
const config = { host: "localhost", port: 3000 };
type Config = typeof config; // { host: string; port: number }
typeof (em uma posição de tipo) captura o tipo inferido de um valor em tempo de execução, para que você não tenha que escrever o tipo separadamente.
function getProp<T, K extends keyof T>(obj: T, key: K): T[K] {
return obj[key];
}
const user = { id: 1, name: "Ann" };
getProp(user, "name"); // returns string
getProp(user, "age"); // ❌ Error: "age" is not a key of user
Aqui K extends keyof T restringe key para chaves reais, e T[K] (um tipo de acesso indexado) retorna o tipo exato do valor para essa chave. Erros de digitação se tornam erros de compilação.
const Roles = { Admin: "admin", User: "user" } as const;
type Role = typeof Roles[keyof typeof Roles]; // "admin" | "user"
keyof e typeof conectam o mundo do valor e o mundo do tipo.
Eles potencializam o acesso a propriedades seguro de tipos, derivam tipos de configurações/constantes (fonte única de verdade) e são blocos de construção para tipos mapeados e condicionais.
É assim que você evita manter manualmente definições de tipo paralelas.