WebStorm - Mongoose NPM 包掩盖了自动完成的承诺

WebStorm - Mongoose NPM package masks Promise for auto-complete

我遇到了一个奇怪的问题。

在 WebStorm 中,使用 JavaScript 设置为 ECMAScript 6,如果我安装 mongoose NPM 模块,并将 project-name/node_modules 作为库(这是默认行为),那么mongoose 模块似乎用部分内容屏蔽了默认的 Promise 自动完成。

此部分识别 new Promise(),但不会自动完成 Promise. 的任何内容,并告诉我 Promise.all() 之类的内容未导入。

有没有办法告诉 WebStorm 给一件事(内置定义)优先于 node_modules,这样它就不会让它们覆盖这些核心的东西?

奇怪的是,如果我点击 Ctrl+B 转到 Promise 的定义,它仍然会将我带到它通常从中读取的 lib.es6.promise.d.ts 文件,并且没有提及mongoose 定义 Promise。

Mongoose 4.x 破坏了内置类型 Promise 的全局定义。

/nodes_module/mongoose/lib/index.js 中你会发现这个定义:

/**
 * Returns the current ES6-style promise constructor. In Mongoose 4.x,
 * equivalent to `mongoose.Promise.ES6`, but will change once we get rid
 * of the `.ES6` bit.
 *
 * @method Promise
 * @api public
 */

此 JSDoc 样式声明覆盖了 ES6 的内置 Promise 类型的全局定义。

您可以从 Webstorm 的智能感知中排除 index.js 文件。导航到文件浏览器中的文件,然后右键单击 select "Mark as plain text".

您应该使用 Mongoose 的 TypeScript 定义,而不是节点模块。这可以通过 npm install @types/mongoose 安装,也可以在 WebStorm 设置对话框的 JavaScript 库中将其作为一种类型下载。