【发布时间】:2021-07-16 20:34:41
【问题描述】:
基于mongoose的documentation,我尝试创建一个可链接的byYear查询助手方法如下:
import * as mongoose from 'mongoose'
import { IMovie } from '../interfaces/movies'
export interface MovieDocument extends IMovie, mongoose.Document {}
const schema = new mongoose.Schema({
id: {
type: String,
required: [true, 'Missing ID'],
index: { unique: true },
},
title: { type: String, required: [true, 'Missing title'] },
year: Number,
director: String,
actor: [String],
})
schema.query.byYear = function (year) {
return this.find({ year: year })
}
export const Movie = mongoose.model<MovieDocument>(
'Movies',
schema,
'Movies'
)
其中IMovie 是一个简单的interface,具有与schema 相同的字段。
然后我尝试使用我的查询助手:
Movie.find().byYear(year).then(movies => {
console.log('found these movies:', movies)
}).catch(err => {
console.log('error:' + err)
})
但我得到Property 'byYear' does not exist on type 'Query<MovieDocument[], MovieDocument, {}>' 的Movie.find().byYear() 部分。尽管如此,代码似乎可以工作,但似乎由于输入不足,VS Code 没有意识到Movie.find() 返回的Query 实际上确实 有一个byYear 方法。我该如何正确地做到这一点?
2021-05-02 更新:我应该更多地强调我提供的代码工作很漂亮。我的问题和问题的问题更适合如何在 TypeScript 中正确“输入”它,或者仅仅是为什么会发生错误。
【问题讨论】:
-
并非如此。在尝试确切回答该问题的内容时,我得到
Type '{ byYear(this: mg.DocumentQuery<any, MovieDocument>, year: number): mg.Query<MovieDocument[], MovieDocument, {}>; }' is not assignable to type '{ [name: string]: <T extends any = any>(this: T, ...args: any[]) => any; }'. Property 'byYear' is incompatible with index signature.(这是我的签名:byYear(this: mg.DocumentQuery<any, MovieDocument>, year: number))。链接的 PR 已合并,我有最新版本。可能相关:github.com/DefinitelyTyped/DefinitelyTyped/issues/23132
标签: node.js mongodb typescript mongoose typescript-typings