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

Iva*_*kin 1 javascript mongoose mongodb typescript

我想使用查询助手 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')
})
Run Code Online (Sandbox Code Playgroud)

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

Mat*_*hen 5

我已经起草了一个@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);
Run Code Online (Sandbox Code Playgroud)

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