TypeScript Tipos Intermediário
Utility types
Utility types são tipos genéricos fornecidos pelo TypeScript que transformam outros tipos. Eles evitam repetição e mantêm a consistência quando a forma de um tipo base muda. Os mais usados são Partial<T>, Required<T>, Pick<T, K>, Omit<T, K>, Record<K, V>, ReturnType<F> e Parameters<F>.
Partial<T> torna todas as propriedades de T opcionais, enquanto Required<T> faz o contrário: todas se tornam obrigatórias. Pick<T, K> cria um tipo com apenas as chaves K de T, e Omit<T, K> cria um tipo sem essas chaves. Record<K, V> constrói um objeto com chaves do tipo K e valores do tipo V.
Já ReturnType<F> extrai o tipo de retorno de uma função F, e Parameters<F> extrai a tupla de parâmetros. Esses dois são úteis para reutilizar a assinatura de funções existentes sem duplicar código.
Neste card, você vai praticar a combinação desses utility types para modelar dados de forma segura e expressiva.
Pontos-chave
Partial<T>deixa todas as propriedades opcionais;Required<T>as torna obrigatórias.Pick<T, K>seleciona chaves;Omit<T, K>remove chaves.Record<K, V>cria um mapa com chavesKe valoresV.ReturnType<F>eParameters<F>extraem tipos de funções existentes.- Utility types são composáveis: você pode aninhar um dentro do outro.
// Exemplo prático de utility types em TypeScript
interface Usuario {
id: number;
nome: string;
email: string;
ativo: boolean;
}
// Partial: atualização parcial de usuário
function atualizarUsuario(id: number, dados: Partial<Usuario>): Usuario {
const base: Usuario = { id, nome: "Anônimo", email: "", ativo: false };
return { ...base, ...dados };
}
// Required: garante que todos os campos estejam presentes
function validarUsuario(u: Required<Usuario>): void {
console.log(`Usuário ${u.nome} validado.`);
}
// Pick e Omit
type ResumoUsuario = Pick<Usuario, "id" | "nome">;
type UsuarioSemEmail = Omit<Usuario, "email">;
// Record: mapa de id para usuário
const usuariosPorId: Record<number, ResumoUsuario> = {
1: { id: 1, nome: "Ana" },
2: { id: 2, nome: "Bruno" },
};
// ReturnType e Parameters
function criarUsuario(nome: string, email: string): Usuario {
return { id: Date.now(), nome, email, ativo: true };
}
type RetornoCriar = ReturnType<typeof criarUsuario>;
type ParamsCriar = Parameters<typeof criarUsuario>;
const params: ParamsCriar = ["Carla", "carla@ex.com"];
const novo: RetornoCriar = criarUsuario(...params);
console.log(atualizarUsuario(1, { nome: "Ana Silva" }));
validarUsuario({ id: 3, nome: "Dora", email: "dora@ex.com", ativo: true });
console.log(usuariosPorId[2].nome);
console.log(novo.nome);