You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
hasezoey 7404c44c84
style: apply eslint rules to top level and website js files
2 years ago
.github chore(workflow): codeql-analysis: remove unnecessary step 2 years ago
.husky chore(husky): upgrade to version "6.0.0" 2 years ago
.vscode chore: replace "tslint" with "eslint" 2 years ago
docs dependencies(mongoose): upgrade to version 5.13.8 2 years ago
src feat(hooks): add ability to set hook options 2 years ago
test feat(hooks): add ability to set hook options 2 years ago
website style: apply eslint rules to top level and website js files 2 years ago
.editorconfig enable "strictNullChecks" 3 years ago
.eslintignore style: apply eslint rules to top level and website js files 2 years ago
.eslintrc.js style: apply eslint rules to top level and website js files 2 years ago
.gitignore Add Inheritance Tests 4 years ago
.npmignore Small Changes 4 years ago
.npmrc Set Version to 6.0.0-0 [Pre] 4 years ago
.prettierrc chore: replace "tslint" with "eslint" 2 years ago
.releaserc.js chore(releaserc): fix why no "major" was being released 2 years ago
CHANGELOG.md release: v8.2.0 2 years ago
LICENSE chore(LICENSE): update to represent current times 2 years ago
README.md docs(README): corrected usage of articles (#540) 2 years ago
commitlint.config.js style: apply eslint rules to top level and website js files 2 years ago
ghPagesPre.sh remove "ls" from travis script 3 years ago
jest.config.json chore(deps): update "ts-jest" to 26.4.4 3 years ago
lint-staged.config.js style: apply eslint rules to top level and website js files 2 years ago
package.json release: v8.2.0 2 years ago
tsconfig.build.json style: apply eslint rules to top level and website js files 2 years ago
tsconfig.json style: apply eslint rules to top level and website js files 2 years ago
yarn.lock chore(deps): bump tar from 6.1.2 to 6.1.11 (#600) 2 years ago

README.md

Typegoose

(These badges are from typegoose:master)
Node.js Tests Coverage Status npm

Define Mongoose models using TypeScript classes

Basic usage

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

class User {
  @prop()
  public name?: string;

  @prop({ type: () => [String] })
  public jobs?: string[];
}

const UserModel = getModelForClass(User); // UserModel is a regular Mongoose Model with correct types

(async () => {
  await mongoose.connect('mongodb://localhost:27017/', { useNewUrlParser: true, useUnifiedTopology: true, dbName: 'test' });

  const { _id: id } = await UserModel.create({ name: 'JohnDoe', jobs: ['Cleaner'] } as User); // an "as" assertion, to have types for all properties
  const user = await UserModel.findById(id).exec();

  console.log(user); // prints { _id: 59218f686409d670a97e53e0, name: 'JohnDoe', __v: 0 }
})();

Motivation

A common problem when using Mongoose with TypeScript is that you have to define both the Mongoose model and the TypeScript interface. If the model changes, you also have to keep the TypeScript interface file in sync or the TypeScript interface would not represent the real data structure of the model.

Typegoose aims to solve this problem by defining only a TypeScript interface (class), which needs to be enhanced with special Typegoose decorators (like @prop).

Under the hood it uses the Reflect & reflect-metadata API to retrieve the types of the properties, so redundancy can be significantly reduced.

Instead of writing this:

// This is a representation of how typegoose's compile output would look like
interface Car {
  model?: string;
}

interface Job {
  title?: string;
  position?: string;
}

interface User {
  name?: string;
  age!: number;
  preferences?: string[];
  mainJob?: Job;
  jobs?: Job[];
  mainCar?: Car | string;
  cars?: (Car | string)[];
}

const JobSchema = new mongoose.Schema({
  title: String;
  position: String;
});

const CarModel = mongoose.model('Car', {
  model: string,
});

const UserModel = mongoose.model('User', {
  name: { type: String },
  age: { type: Number, required: true },
  preferences: [{ type: String }],
  mainJob: { type: JobSchema },
  jobs: [{ type: JobSchema }],
  mainCar: { type: Schema.Types.ObjectId, ref: 'Car' },
  cars: [{ type: Schema.Types.ObjectId, ref: 'Car' }],
});

You can just write this:

class Job {
  @prop()
  public title?: string;

  @prop()
  public position?: string;
}

class Car {
  @prop()
  public model?: string;
}

class User {
  @prop()
  public name?: string;

  @prop({ required: true })
  public age!: number; // This is a single Primitive

  @prop({ type: () => [String] })
  public preferences?: string[]; // This is a Primitive Array

  @prop()
  public mainJob?: Job; // This is a single SubDocument

  @prop({ type: () => Job })
  public jobs?: Job[]; // This is a SubDocument Array

  @prop({ ref: () => Car })
  public mainCar?: Ref<Car>; // This is a single Reference

  @prop({ ref: () => Car })
  public cars?: Ref<Car>[]; // This is a Reference Array
}

Extra Examples


Requirements & Install

Typegoose's Quick Start Guide

Testing

yarn install
yarn run test

Versioning

This Project should comply with Semver. It uses the Major.Minor.Fix standard (or in NPM terms, Major.Minor.Patch).

Join Our Discord Server

To ask questions or just talk with us, join our Discord Server.

Documentation

Known Issues

Here are the known-issues

FAQ

Here is the FAQ

Notes

  • Please don't add +1 or similar comments to issues. Use the reactions instead.