Skip to content

QuickModelEl Kit Completo de Modelado TypeScript

30+ transformadores de tipos, validación en dos capas, mocks, 7 formatos de schema y servidor MCP para IA — desde un único decorador `@Quick`.

Angular
React
Vue.js
Svelte
NestJS
Electron
GraphQL
Prisma
Redux
Vitest
Angular
React
Vue.js
Svelte
NestJS
Electron
GraphQL
Prisma
Redux
Vitest
tRPC
TanStack
OpenAPI
React Hook Form
Zod
TypeScript
Mo
Mongoose
Ty
TypeORM
MS
MSW
Fo
Formik
Zu
Zustand
Bun
Jest
tRPC
TanStack
OpenAPI
React Hook Form
Zod
TypeScript
Mo
Mongoose
Ty
TypeORM
MS
MSW
Fo
Formik
Zu
Zustand
Bun
Jest

💡 ¿Por qué QuickModel? ​

QuickModel es más que una librería de serialización — es una plataforma de desarrollo completa para aplicaciones TypeScript intensivas en datos.

🔄 Transformación de Tipos

  • 30+ Transformadores: Date, BigInt, Set, Map, RegExp, Symbol, Error, WeakMap, WeakSet, ArrayBuffer, TypedArray, URL… Cada tipo tiene su propio transformer especializado.
  • Arrays multi-dimensionales: sintaxis explícita [Date], [[Post]], [[[Map]]] para 1D, 2D o 3D.
  • WeakMap / WeakSet: cachés en memoria que nunca se serializan. Perfecto para referencias runtime GC-friendly.
  • Notación de punto: transforma propiedades anidadas directamente en el decorador padre, sin decorar clases externas.

🧠 Sistema de Decoradores

  • @Quick: decorador de clase que configura todos los transformadores de golpe.
  • @QType: decorador de propiedad para casos concretos o contextos distintos.
  • @QAlias: renombra campos entre el JSON de entrada y la instancia. Perfecto para snake_case ↔ camelCase.
  • @QComputed: define getters que aparecen en serialize() sin existir en el JSON original.
  • excludeFields: excluye campos permanentemente de toda serialización (password, _checksum, etc.).

✅ Validación en Dos Capas

  • Capa 1 — Integridad: checkIntegrity() verifica que cada valor coincide con su transformer (fechas inválidas, BigInt fuera de rango, RegExp peligroso).
  • Capa 2 — Negocio: @QRule aplica predicados declarativos por campo. checkRules() devuelve errores con campo y mensaje.
  • Combinado: isValid() ejecuta ambas capas en una sola llamada. validationReport() separa los errores por origen.

📋 Formularios y Validación por Grupos

  • Funciona en cualquier clase: @QField, @QRule y @QGroup no requieren extender QModel. Sirve para DTOs, formularios Angular/Vue/React…
  • Grupos como wizard: qCheckRulesByGroup() valida solo el grupo activo, perfecto para formularios multi-paso.
  • Reglas async: qCheckRulesAsync() soporta predicados que retornan Promise<boolean> con timeoutMs y modo serial/parallel.

🗂️ 7 Formatos de Schema

Un solo método getSchema(format) exporta tu modelo como:
json · zod · openapi · mongo · typescript · graphql · ajv

Documentación, validación y contratos de API siempre sincronizados con tu código.

🤖 Servidor MCP — IA Integrada

QuickModel incluye 20 herramientas y 20 prompts guiados: create_model, interface_to_model, get_model_schema, generate_mock, simulate_validation, diff_models, roundtrip…

  • Para novatos: la IA sabe exactamente cómo escribir QuickModel válido porque la librería se lo dice.
  • Para pros: genera modelos desde JSON en milisegundos y valida arquitectura sin cambiar de contexto.

🧪 Mocks Sin Fixtures

  • User.mock().random() → objeto válido y tipado con datos realistas.
  • User.mock().array(5) → array de 5 instancias.
  • User.mock().random({ name: 'Alice' }) → objeto con campos sobreescritos.
  • Powered by @faker-js/faker. Perfecto para desarrollar UI antes de que la API exista.

🧩 Polimorfismo Automático

Las APIs devuelven objetos variados en la misma lista (Payment → Card o PayPal). QuickModel instancia la subclase correcta automáticamente según la forma del dato. Sin switch, sin factories.

🔒 Seguridad y Protección

  • Referencias circulares: la serialización no crashea — los campos circulares se reemplazan por { __circular: true } en la salida.
  • Inyección: valida URLs (bloquea javascript:) y limita longitud de RegExp.
  • Contaminación de prototipos: propiedades __proto__ excluidas automáticamente.
  • Modo estricto: unknownPropertyPolicy: 'error' lanza error ante propiedades inesperadas en APIs públicas.

🔗 Compatibilidad

  • Mixin QModel.extends(BaseClass): añade superpoderes a entidades TypeORM, DTOs de NestJS o cualquier clase sin tocar la jerarquía.
  • TC39 + Legacy: compatible con experimentalDecorators (TS 3.4+) y el estándar TC39 (TS 5+).
  • Tres estilos de propiedad: declare, ! y ? funcionan igual.

🎯 Comparativa de características

QuickModel vs otras librerías con características similares

🎯 Características ofrecidas por cada librería

⚠️ = disponible con código manual adicional

Tipo:
Librerías:
Características:
CaracterísticaQuickModelarktypeclass-transformerclass-validatorfaker (manual)ImmerjoisuperjsonTypeBoxvalibotvestyupZodPlain JS
Campos computados (@QComputed)✅❌❌❌❌❌❌❌❌❌❌❌❌❌
Coerción automática✅❌ ⚠️ ❌❌❌❌❌❌ ⚠️ ❌❌ ⚠️ ❌
copy() / isDirty()✅❌❌❌❌ ⚠️ ❌❌❌❌❌❌❌❌
Exportar schema (JSON/Zod/OpenAPI)✅❌❌❌❌❌❌❌✅❌❌❌❌❌
Form schemas (@QField)✅❌❌❌❌❌❌❌❌❌ ⚠️ ❌❌❌
Generación de mocks tipados✅❌❌❌❌❌❌❌❌❌❌❌❌❌
Grupos de validación✅❌❌ ⚠️ ❌❌❌❌❌❌✅❌❌❌
Herencia multinivel con inferencia✅❌ ⚠️ ❌❌❌❌❌❌❌❌❌❌❌
IA / Servidor MCP integrado✅❌❌❌❌❌❌❌❌❌❌❌❌❌
Inferencia TS compile-time✅✅❌❌❌ ⚠️ ❌❌✅✅❌❌✅❌
Integridad en runtime✅✅❌ ⚠️ ❌❌ ⚠️ ❌✅ ⚠️ ⚠️ ⚠️ ✅❌
JSON polimórfico✅❌ ⚠️ ❌❌❌❌ ⚠️ ❌❌❌❌❌❌
Preserva RegExp/undefined/NaN✅❌❌❌❌❌❌✅❌❌❌❌❌❌
Reglas de negocio async (@QRule)✅❌❌ ⚠️ ❌❌ ⚠️ ❌❌❌ ⚠️ ⚠️ ⚠️ ❌
Restricciones (@IsEmail…)✅❌❌✅❌❌❌❌❌❌❌❌❌❌
Serialización nativa (toJSON)✅❌ ⚠️ ❌❌❌❌✅❌❌❌❌❌❌
Tree-shakeable✅✅❌❌✅✅❌❌ ⚠️ ✅❌❌❌❌

🚀 Ejemplos Rápidos ​

🏗️ Coerción de tipos con @Quick y QModel

Un solo decorador transforma strings JSON en BigInt, Date, Map y más

import { QModel, Quick } from 'quickmodel';

interface IUser {
  name: string;
  balance: bigint;
  lastLogin: Date;
  roles: Set;
}

@Quick({
  balance: 'bigint',  // primitive alias
  lastLogin: Date,    // native constructor
  roles: Set,         // complex collection
})
class User extends QModel {
  declare name: string;
  declare balance: bigint;
  declare lastLogin: Date;
  declare roles: Set;
}

const user = new User({
  name: 'Alice',
  balance: '500000000000000000',      // string → BigInt auto-coerced
  lastLogin: '2024-03-15T10:00:00Z',  // string → Date auto-coerced
  roles: ['admin', 'editor'],          // array  → Set  auto-coerced
});

console.log(user.balance + 1n);            // 500000000000000001n
console.log(user.lastLogin.getFullYear()); // 2024
console.log(user.roles.has('admin'));      // true