Como criar um objeto com base em uma interface no TypeScript: explicação completa com código
Você já se deparou com uma situação em que o TypeScript literalmente "grita" com você porque você está tentando criar um objeto que não corresponde à interface? Familiar? Se você trabalha com TypeScript há pelo menos uma semana, com certeza já viu este erro:
Type '{}' is missing the following properties from type 'User': name, ageEste é um dos problemas mais populares no Stack Overflow (dezenas de milhares de visualizações), e hoje vamos resolvê-lo de uma vez por todas. Neste artigo, você aprenderá como criar um objeto com base em uma interface no TypeScript, quais são as formas e quando usar cada uma.
Por que este tópico é tão importante?
TypeScript é uma extensão do JavaScript que adiciona tipagem estática. As interfaces do TypeScript são uma ferramenta poderosa para descrever a estrutura de objetos. Mas os iniciantes frequentemente se confundem: "Eu declarei uma interface, mas como crio um objeto real agora?"
Sem o entendimento correto dessa mecânica, você perderá horas depurando ou, pior ainda, usará any — o que é um caminho direto para perder todas as vantagens do TypeScript.
Método 1: Atribuição direta (o mais simples)
A maneira mais óbvia de criar um objeto a partir de uma interface TypeScript é simplesmente atribuir um literal de objeto a uma variável com o tipo da interface:
interface User { name: string; age: number; email?: string; // campo opcional}
// ✅ Correto: objeto corresponde completamente à interfaceconst user: User = { name: "Ana", age: 28, email: "ana@exemplo.com"};
// ✅ Também correto: campo opcional pode ser omitidoconst userMinimal: User = { name: "João", age: 35};Isso funciona, mas há um detalhe: o TypeScript verificará se o objeto possui TODOS os campos obrigatórios. Se você esquecer name ou age, o compilador emitirá um erro.
❌ Erro típico de iniciantes
// ❌ Erro! Campo obrigatório 'age' ausenteconst badUser: User = { name: "Pedro"};Método 2: Usando o operador as (type assertion)
Às vezes, você precisa criar um objeto gradualmente, por exemplo, preenchendo-o de diferentes fontes. Nesses casos, você pode usar o operador as:
interface Config { apiUrl: string; timeout: number; retries: number;}
// Criando um objeto vazio com type assertionconst config = {} as Config;
// Agora você pode adicionar campos um por umconfig.apiUrl = "https://api.exemplo.com";config.timeout = 5000;config.retries = 3;
// ✅ Funciona, mas TOME CUIDADO!⚠️ Aviso: Este método desativa a verificação de tipos no momento da criação do objeto. Você pode acidentalmente pular um campo obrigatório e só descobrir isso em tempo de execução. Use as apenas quando tiver certeza de que todos os campos serão preenchidos.
Método 3: Função fábrica (recomendado)
A melhor maneira de criar um objeto com base em uma interface no TypeScript é escrever uma função fábrica. Isso oferece 100% de segurança de tipos e a capacidade de definir valores padrão:
interface Product { id: number; title: string; price: number; inStock: boolean; description?: string;}
// Função fábrica com parâmetros padrãofunction createProduct( id: number, title: string, price: number, inStock: boolean = true, description?: string): Product { return { id, title, price, inStock, ...(description && { description }) };}
// Usoconst laptop = createProduct(1, "Notebook", 999.99);const phone = createProduct(2, "Smartphone", 599.99, false, "Ótimo telefone");
console.log(laptop); // { id: 1, title: 'Notebook', price: 999.99, inStock: true }console.log(phone)