vscode智能感知NodeJs

在vscode中,开发人员可以将代码中的variables和对象的方法和属性hover,并向您显示有关它们的信息。 不幸的是,一旦我们将代码传递给另一个文件中的模块(因为JavaScript是静态types的),就会丢失它。 有没有什么办法可以让我明确地键入传递给模块的参数? 或者可能是某种源地图? 我有一个问题的例子:

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 } 

更新

我一直在寻找答案,但没有find答案。 这是最接近我得到的工作,但由于某种原因,编辑不希望应用该types。 见下文:

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 } 

…因为JavaScript是静态types。

JavaScript不是静态types的。 它是dynamicinput的。

有没有什么办法可以让我明确地键入传递给模块的参数?

是。 使用TypeScript 。 它提供了可选的静态types 。

说明

在下面的屏幕截图中,智能感应确实起作用。 这是显示该appanytypes的。 这是我们可以用JavaScript做的最好的,因为JavaScript是dynamicinput的。 在编译时, app确实可以是anytypes的。 dynamictypes意味着只在运行时检查types。

在这里输入图像描述

第一个问题是VS Code无法确定app实际上是Expresstypes的。 这就是为什么你的第二个版本的route.js似乎是有道理的。

问题在于JSDoc不支持对象types,正如VS Code所解释的那样。

VS代码内部使用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; 

所以,如果你的确非常冒险,那么你可以添加最需要的属性。 我不认为这是值得的。

最后的select是实际使用TypeScript。 它不需要对您的代码产生巨大的影响,并会提供您所需的types信息。

所以我创build了一个route.ts

 import 'node'; import { Express } from 'Express'; module.exports = function(app: Express) { // Your code with IntelliSense goes here } 

这保留了types信息和智能感知,并且像魅力一样工作。 权衡是,你需要一个更多的构build步骤(你可以在你的任务跑步者透明地处理或使用tsc --watch )。

然后,再次获得所需的智能感知,而不必绑定到ES6(默认的TypeScriptconfiguration使用ES5),而不必被迫使用更多的TypeScript。 如果你喜欢,你所有的代码都可以是普通的JavaScript。

回顾一下,你的三个select是:

  1. 没有智能感知。
  2. 键入明确列出所需属性或function的注释。
  3. 使用TypeScripttypes的注释。

编辑 :我应该补充说,我还安装了节点和Express的TypeScripttypes导入。 我不确定他们是否明确需要,但如果你想要走这条路,你应该安装它们。

用这个:

 npm install @types/node npm install @types/express 

VS Code中有一个非常有用的function,可以启用合成默认导入。 它会自动从JSDoc或types定义文件中导入input信息。

我已经链接了一篇博客文章 ,向您展示如何进行设置,以及其function的实际示例

我认为更好的解决scheme是这样的:

 function myFunc() { //damn code } export default myFunc 

正如你所看到的,这个函数没有被包装,但是需要es6;)