vscode智能感知NodeJs
在vscode中,开发人员有能力将鼠标悬停在代码中变量和对象的方法和属性上,并向您显示有关它们的信息。 不幸的是,一旦我们将代码传递给另一个文件中的模块(因为JavaScript是静态类型的),这会丢失。 有没有什么办法可以让我显式地输入传递给模块的参数? 或者可能是某种源图? 我遇到问题的一个例子:
app.js
var express = require('express')
var app = express()
var routes = './routes/route.js'
route.js
module.exports = function(app) {
// Hovering over app doesn't show the intellisense like it does in app.js
}
更新
我一直在寻找答案,但没有找到答案。 这是我得到它最接近的工作,但由于某种原因,编辑不想应用该类型。 见下文:
route.js
import Express from 'Express'
/**
* @param {Express} app
*/
module.exports = function(app) {
// Hovering over app doesn't show the intellisense like it does in app.js
}
第一个问题是VS Code无法确定app
实际上是Express
类型。 这就是为什么你的第二版route.js
似乎有意义。
问题在于JSDoc不支持对象类型,正如VS Code所解释的那样。
VS Code内部使用JavaScript语言服务,如下所示。 问题是,JavaScript语言服务本身实际上是TypeScript(请参阅同一页面上的链接)。
这以下面的方式回答你的问题:
首先,VS代码支持的JSDoc注释与TypeScript支持的相同。 从TypeScript文档中,这不受支持:
/**
* @param {object} param1 - Listing properties on an object type does not work
* @param {string} param1.name
*/
function fn7(param1) {}
这就是为什么你的第二次尝试没有奏效。
但是这是支持的:
/** @type {{a: string, b: number}} */
var var12;
所以如果你的确非常冒险,那么你可以通过这种方式添加最需要的属性。 我不认为这是值得的。
最后的选择是实际使用TypeScript。 它不需要对您的代码产生巨大影响,并会为您提供所需的类型信息。
所以我创建了一个route.ts
:
import 'node';
import { Express } from 'Express';
module.exports = function(app: Express) {
// Your code with IntelliSense goes here
}
这保留了类型信息和智能感知,并且像魅力一样工作。 权衡是你需要更多的构建步骤(你可以在任务运行器中透明地处理或使用tsc --watch
)。
然后,再次获得所需的智能感知,而不必绑定到ES6(默认的TypeScript配置使用ES5),并且不会被迫使用任何更多的TypeScript。 如果你喜欢它,所有其他的代码都可以是普通的JavaScript。
回顾一下,你的三个选择是:
编辑 :我应该补充说我还为Node和Express安装了TypeScript类型的导入。 我不确定他们是否明确需要,但如果你想要走这条路线,你应该安装它们。
用这个:
npm install @types/node
npm install @types/express
...因为JavaScript是静态类型。
JavaScript不是静态类型的。 它是动态输入的。
有没有什么办法可以让我显式地输入传递给模块的参数?
是。 使用TypeScript。 它提供了可选的静态类型。
说明
在以下屏幕截图中,Intellisense确实有效。 它显示该app
是any
类型的。 这是我们可以用JavaScript完成的最好的工作,因为JavaScript是动态输入的。 在编译时, app
的确可以是any
类型的。 动态类型意味着只在运行时检查类型。
VS Code中有一个非常有用的功能,可以启用合成默认导入。 它会自动从JSDoc或类型定义文件中导入输入信息。
我已经链接了一篇博客文章,向您展示如何进行设置以及其功能的实际示例
链接地址: http://www.djcxy.com/p/94863.html