如何声明可与 ESLint 一起使用的 mongoose 静态方法

Posted

技术标签:

【中文标题】如何声明可与 ESLint 一起使用的 mongoose 静态方法【英文标题】:how to declare mongoose static methods that will work with ESLint 【发布时间】:2019-08-30 16:04:38 【问题描述】:

在 MongoDB 中使用 Mongoose ORM

我已经声明了一个 mongoose 静态方法,例如:

ConvoDataSchema.statics.randomItem = async function ()  ... 

然后用它创建一个模型

const ConvoData = mongoose.model('ConvoData', ConvoDataSchema)

但稍后当我想调用该方法时:

let convoData = await ConvoData.randomItem()

我的 linter 不知道 ConvoData 已经被 Mongoose 修补了这个神奇的方法。

如何声明这些方法,以便 Linter (TSLint / VSCode Intellisense) 可以正确发现这些方法?

【问题讨论】:

我正在使用ESLintVSCode,它对我来说可以正常工作。 它在你声明它的那一行上工作,但在其他文件中 ESLint 是否知道 ConvoData.xx() 方法声明?我认为 ESLint 可以解析内联语法,但无法识别它为导出而附加的对象。 【参考方案1】:

我认为您可以告诉 ESLint “忽略”这样的行,或者您可以变得非常奇怪并执行以下操作:

let convoData = await ConvoDataSchema.statics.randomItem.call(ConvoData)

很糟糕,这两种解决方案都没有您希望的那么优雅。

【讨论】:

【参考方案2】:

查看文档我发现了这个:https://mongoosejs.com/docs/guide.html#statics

不要使用 ES6 箭头函数 (=>) 声明静态。箭头函数显式阻止绑定 this,因此由于 this 的值,上述示例将不起作用。"

这可能是你的问题吗?

【讨论】:

这可能是运行时问题。但是编译时的 linter 和智能感知并不能真正解决这些问题。也许真正的 AST 分析 linter 可以,但我不认为 ESLint 属于该类别。【参考方案3】:

现在我在大多数项目中都使用 typescript,并且由于上述一些原因以及更多原因,mongoose 无法获得不错的智能感知,我的解决方案是不使用 mongoose...

【讨论】:

【参考方案4】:

如果完全像这样声明:

ConvoDataSchema.statics.randomItem = async function () 
const ConvoData = mongoose.model('ConvoData', ConvoDataSchema)

它不会起作用,因为方法没有关闭。您应该尝试关闭该方法。 另外,返回的方法到底是什么,这样我们就可以正确调试方法了。

【讨论】:

这只是源代码的 sn-p。我已经在上面说得更清楚了。

以上是关于如何声明可与 ESLint 一起使用的 mongoose 静态方法的主要内容,如果未能解决你的问题,请参考以下文章

在 Rails 中,如何以可与 ActiveSupport::TimeZone[zone].parse() 一起使用的格式获取当前时区 (Time.zone)?

如何让 VueJS + ESLint (Airbnb) + Prettier 一起工作? (VS代码)

如何让本地 eslint 插件与本地安装的 eslint 一起工作

如何配置 ESLint 以与 PhpStorm 一起使用以自动修复 ESLint 错误

透明 ViewController 可与 presentViewController 一起使用,但不能与 pushViewController 一起使用

可与仅派生方法一起使用的 C++ 继承函数指针