如何声明可与 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) 可以正确发现这些方法?
【问题讨论】:
我正在使用ESLint
和VSCode
,它对我来说可以正常工作。
它在你声明它的那一行上工作,但在其他文件中 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 一起使用