Typegoose para TypeScript: guía completa con ejemplos

Entrenador de Python en Línea para Principiantes

Aprende Python fácilmente sin sobrecargarte de teoría. Resuelve tareas prácticas con verificación automática, recibe pistas y escribe código directamente en el navegador, sin instalar nada.

Start Course

Typegoose para TypeScript: Guía completa

Typegoose es una potente biblioteca envoltorio para Mongoose que permite definir modelos de MongoDB utilizando clases y decoradores de TypeScript. Resuelve un problema clave en el desarrollo con Node.js: la falta de coincidencia entre el tipado estricto de TypeScript y la naturaleza dinámica de Mongoose. En lugar de duplicar manualmente tipos y esquemas, Typegoose te permite describir el modelo una sola vez —como una clase de TypeScript— y genera automáticamente el esquema de Mongoose a partir de ella.

¿Por qué es útil? Primero, reduce significativamente la cantidad de código repetitivo. Ya no necesitas escribir una interfaz separada y un esquema aparte: la clase TypeScript cumple ambas funciones. Segundo, Typegoose garantiza total seguridad de tipos en todas las etapas: desde la creación de un documento hasta la ejecución de consultas. El IDE te sugerirá campos, métodos y sus tipos, eliminando prácticamente los errores por nombres mal escritos o tipos de datos incorrectos. Tercero, la biblioteca soporta todas las funcionalidades de Mongoose: campos virtuales, hooks (pre/post), índices, populate y middleware.

Typegoose es ideal para proyectos grandes donde la mantenibilidad del código es crucial, así como para equipos que quieren aprovechar al máximo la programación orientada a objetos en TypeScript. Se integra fácilmente con NestJS, Express y otros frameworks, proporcionando un estándar unificado para la descripción de datos.

Instalación

Para instalar Typegoose y sus dependencias, ejecuta en la terminal:

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

Si usas yarn:

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

Typegoose requiere TypeScript versión 4.0 o superior. Asegúrate de que tu archivo tsconfig.json incluya las siguientes opciones:

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

Inicio rápido

Vamos a crear un modelo simple de usuario y guardarlo en MongoDB.

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

// 1. Definimos la clase del modelo
class User {
  @prop({ required: true })
  public name!: string;

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

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

// 2. Obtenemos el modelo de Mongoose
const UserModel = getModelForClass(User);

// 3. Nos conectamos a la BD y trabajamos
async function main() {
  await mongoose.connect('mongodb://localhost:27017/test');

  // Creamos un usuario
  const user = await UserModel.create({
    name: 'Alice',
    email: 'alice@example.com',
    age: 30,
  });

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

  // Buscamos un usuario
  const found = await UserModel.findOne({ email: 'alice@example.com' });
  console.log('Encontrado:', found);
}

main().catch(console.error);

Este ejemplo mínimo muestra la idea principal: la clase User con el decorador @prop describe el esquema, y la función getModelForClass crea un modelo de Mongoose listo para usar.

Métodos y funciones principales

1. @prop() — decorador de propiedad

Firma: @prop(options?: PropOptions)

Descripción: Define un campo en el esquema de Mongoose. Acepta un objeto de opciones similar a las opciones de campos en 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