Mongoose the Typescript way…?

后端 未结 14 581
遥遥无期
遥遥无期 2020-11-28 19:27

Trying to implement a Mongoose model in Typescript. Scouring the Google has revealed only a hybrid approach (combining JS and TS). How would one go about implementing the

14条回答
  •  我在风中等你
    2020-11-28 20:12

    Here is the example from Mongoose documentation, Creating from ES6 Classes Using loadClass(), converted to TypeScript:

    import { Document, Schema, Model, model } from 'mongoose';
    import * as assert from 'assert';
    
    const schema = new Schema({ firstName: String, lastName: String });
    
    export interface IPerson extends Document {
      firstName: string;
      lastName: string;
      fullName: string;
    }
    
    class PersonClass extends Model {
      firstName!: string;
      lastName!: string;
    
      // `fullName` becomes a virtual
      get fullName() {
        return `${this.firstName} ${this.lastName}`;
      }
    
      set fullName(v) {
        const firstSpace = v.indexOf(' ');
        this.firstName = v.split(' ')[0];
        this.lastName = firstSpace === -1 ? '' : v.substr(firstSpace + 1);
      }
    
      // `getFullName()` becomes a document method
      getFullName() {
        return `${this.firstName} ${this.lastName}`;
      }
    
      // `findByFullName()` becomes a static
      static findByFullName(name: string) {
        const firstSpace = name.indexOf(' ');
        const firstName = name.split(' ')[0];
        const lastName = firstSpace === -1 ? '' : name.substr(firstSpace + 1);
        return this.findOne({ firstName, lastName });
      }
    }
    
    schema.loadClass(PersonClass);
    const Person = model('Person', schema);
    
    (async () => {
      let doc = await Person.create({ firstName: 'Jon', lastName: 'Snow' });
      assert.equal(doc.fullName, 'Jon Snow');
      doc.fullName = 'Jon Stark';
      assert.equal(doc.firstName, 'Jon');
      assert.equal(doc.lastName, 'Stark');
    
      doc = (Person).findByFullName('Jon Snow');
      assert.equal(doc.fullName, 'Jon Snow');
    })();
    

    For the static findByFullName method, I couldn't figure how get the type information Person, so I had to cast Person when I want to call it. If you know how to fix that please add a comment.

提交回复
热议问题