Typegoose com TypeScript: guia completo com exemplos práticos

Treinador Online de Python para Iniciantes

Aprenda Python facilmente sem sobrecarga teórica. Resolva tarefas práticas com verificação automática e escreva código diretamente no navegador.

Start Course

Typegoose com TypeScript: Guia Completo

Typegoose é uma poderosa biblioteca wrapper para o Mongoose que permite definir modelos MongoDB usando classes e decorators do TypeScript. Ela resolve um problema crucial no desenvolvimento com Node.js: a incompatibilidade entre a tipagem estrita do TypeScript e a natureza dinâmica do Mongoose. Em vez de duplicar manualmente tipos e schemas, o Typegoose permite descrever o modelo uma única vez — como uma classe TypeScript — e gera automaticamente o schema Mongoose a partir dela.

Por que usar isso? Primeiro, reduz drasticamente a quantidade de código repetitivo. Você não precisa mais escrever uma interface separada e um schema separado — a classe TypeScript cumpre ambas as funções. Segundo, o Typegoose garante segurança total de tipos em todas as etapas: desde a criação do documento até a execução de consultas. A IDE vai sugerir campos, métodos e seus tipos, praticamente eliminando erros relacionados a digitação incorreta de nomes de campos ou tipos de dados errados. Terceiro, a biblioteca suporta todos os recursos do Mongoose: campos virtuais, hooks (pre/post), índices, populate e middleware.

Typegoose é ideal para projetos grandes, onde a manutenibilidade do código é essencial, e para equipes que desejam aproveitar todos os benefícios da programação orientada a objetos (POO) em TypeScript. Ele se integra facilmente com NestJS, Express e outros frameworks, fornecendo um padrão único para descrição de dados.

Instalação

Para instalar o Typegoose e suas dependências, execute no terminal:

npm install @typegoose/typegoose mongoose
npm install -D @types/mongoose

Se você usa yarn:

yarn add @typegoose/typegoose mongoose
yarn add -D @types/mongoose

O Typegoose requer TypeScript versão 4.0 ou superior. Certifique-se de que as seguintes opções estejam habilitadas no seu tsconfig.json:

{
  "compilerOptions": {
    "experimentalDecorators": true,
    "emitDecoratorMetadata": true,
    "target": "ES2020",
    "module": "commonjs"
  }
}

Início Rápido

Vamos criar um modelo de usuário simples e salvá-lo no MongoDB.

import { prop, getModelForClass } from '@typegoose/typegoose';
import mongoose from 'mongoose';

// 1. Define a classe do modelo
class User {
  @prop({ required: true })
  public name!: string;

  @prop({ required: true, unique: true })
  public email!: string;

  @prop({ default: 0 })
  public age!: number;
}

// 2. Obtém o modelo Mongoose
const UserModel = getModelForClass(User);

// 3. Conecta ao banco e trabalha com os dados
async function main() {
  await mongoose.connect('mongodb://localhost:27017/test');

  // Cria um usuário
  const user = await UserModel.create({
    name: 'Alice',
    email: 'alice@example.com',
    age: 30,
  });

  console.log('Criado:', user);

  // Encontra um usuário
  const found = await UserModel.findOne({ email: 'alice@example.com' });
  console.log('Encontrado:', found);
}

main().catch(console.error);

Este exemplo mínimo demonstra a ideia principal: a classe User com o decorador @prop descreve o schema, e a função getModelForClass cria um modelo Mongoose pronto para uso.

Métodos e Funções Principais

1. @prop() — Decorador de Propriedade

Assinatura: @prop(options?: PropOptions)

Descrição: Define um campo no schema Mongoose. Aceita um objeto de opções semelhante às opções de campos do Mongoose (required, default, unique, ref, enum, etc.).

import { prop } from '@typegoose/typegoose';

class Product {
  @prop({ required: true, type: String })
  public title!: string;

  @prop({ default: 0, min: 0 })
  public price!: number;

  @prop({ enum: ['active', 'inactive'], default: 'active' })
  public status!: string;
}

2.

Recommendations