如何用打字稿在猫鼬模型中定义自定义查询助手?

时间:2018-10-17 13:37:04

标签: javascript mongodb typescript mongoose

我想使用query helper api定义自定义查询助手。 这里是示例:

// models/article.ts

import { Document, Schema, Model, model } from 'mongoose';

interface IArticle extends Document {
   name: string;
}

interface IArticleModel extends Model<IArticle> {
   someStaticMethod(): Promise<any>;
}

const ArticleSchema = new Schema( { name: String } )

ArticleSchema.query.byName = function(name) {
    return this.find({ name })
}

export default model<IArticle, IArticleModel>('Article', ArticleSchema);



// routes/article.ts
import ArticleModel from '../models/article.ts'

router.get('/articles, (req, res) => {
    ArticleModel.find().byName('example')
})

Typescript使用默认链接时会抱怨byName方法。
我可以将其放在IArticleModel界面中,但在那种情况下,我只能从模型中调用它。
我该在哪里定义此方法以可链接的方式使用它?

1 个答案:

答案 0 :(得分:1)

我草拟了a new version of @types/mongoose来支持查询助手。有关安装修改后的@types软件包的方法,请参见this answer。使用我的版本,您应该可以在models/article.ts中编写以下内容:

import { Document, Schema, Model, model, DocumentQuery } from 'mongoose';

interface IArticle extends Document {
   name: string;
}

interface IArticleModel extends Model<IArticle, typeof articleQueryHelpers> {
   someStaticMethod(): Promise<any>;
}

const ArticleSchema = new Schema( { name: String } )

let articleQueryHelpers = {
    byName(this: DocumentQuery<any, IArticle>, name: string) {
        return this.find({ name });
    }
};
ArticleSchema.query = articleQueryHelpers;

export default model<IArticle, IArticleModel>('Article', ArticleSchema);

,然后routes/article.ts将起作用。如果这对您有用,那么我将向DefinitelyTyped上的原始包提交拉取请求。