首页 > 解决方案 > 如何使用打字稿在猫鼬模型中定义自定义查询助手?

问题描述

我想使用 查询助手 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')
})

byName当我将它与默认值链接时,Typescript 抱怨方法。
我可以把它放在IArticleModel接口中,但在那种情况下我只能从模型中调用它。
我应该把这个方法的定义放在哪里才能以可链接的方式使用它?

标签: javascriptmongodbtypescriptmongoose

解决方案


我已经起草了一个支持查询助手的新版本。@types/mongoose有关安装修改包的方法,请参阅此答案。@types使用我的版本,您应该能够在 中编写以下内容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会工作。如果这对您有用,那么我将在DefiniteTyped 上向原始包提交拉取请求。


推荐阅读