【问题标题】:How to properly export classes from NodeJS file?如何从 NodeJS 文件中正确导出类?
【发布时间】:2021-02-22 20:54:51
【问题描述】:

我想将我的课程导出到以下文件中。我试过这个:

const Discord = require('discord.js');

class Client extends Discord.Client {}
class PermissionNode {}
class PermissionNodesManager {}

module.exports.Client = Client;
module.exports.PermissionNode = PermissionNode;
module.exports.PermissionNodesManager = PermissionNodesManager;

这不会引发任何错误,但 Visual Studio Code 的 IntelliSense 自动完成功能不起作用。在类型中显示any。 我只是想像这样要求这个文件:

const Classes = require('those/exported/classes.js');

并像这样使用它:

let another_client = new Classes.Client();

或者像这样:

const MB = require('classes.js');

/**
 * @param {MB.Client} client
 * @param {MB.PermissionNode} node
 * @param {MB.PermissionNodesManager} manager
 */
let func = (client, node, manager) => {}

两种方法都行不通。 IntelliSense 显示如下内容:https://imgur.com/a/McW0Xv8

如何导出这些类以使 IntelliSense 工作?

【问题讨论】:

  • 如果您的主要问题是您的 IDE 的自动完成功能无法正常工作,那么如果您没有在问题中告诉我们您使用的是哪个 IDE,我们就很难准确说出原因.
  • 我使用 Visual Studio Code

标签: node.js class visual-studio-code intellisense


【解决方案1】:

以下是一种快速解决方法(不推荐)(“命名”?/解构要求)。

我不知道为什么这行得通,而 OP 的方式却不行。

const { Client } = require('./module.js');

/**
 * @type {Client}
 */
let x;
x. // intellisense (correct): addListener, channels, ...

只是一个旁注,以下不起作用。

const M1 = require('./module.js');
const { Client } = M1;

/**
 * @type {Client}
 */
let x;
x. // intellisense (wrong): apply, arguments, bind, ...

我不知道 VSCode 和/或 TypeScript 内部发生了什么会导致这种行为 - 我的理解是这些代码 sn-ps 是等效的。

【讨论】:

  • 遗憾的是,这并没有解决我的问题。我在大多数文件中使用我所有的类
  • 这表明这可能是 vs 代码的问题。您是否考虑过向他们提出问题? @PoProstuMieciek
  • 我看到了一些与此相关的已关闭问题,但它们并没有真正解决。它很旧,因为上一期是 2016 年的。我只是在使用你的解决方案。非常感谢
【解决方案2】:

您可以添加 JSDoc 样式的注释块给 VSCode 提示:

/**
 * @returns {Client}
 */
module.exports.Client = Client;
/**
 * @returns {PermissionNode}
 */
module.exports.PermissionNode = PermissionNode;
/**
 * @returns {PermissionNodesManager}
 */
module.exports.PermissionNodesManager = PermissionNodesManager;

添加这些后,IntelliSense 会正确显示类型:

【讨论】:

  • 好的,但如果我这样做:js const MB = require('classes.js'); /** * @param {MB.Client} client * @param {MB.PermissionNode} node * @param {MB.PermissionNodesManager} manager */ let func = (client, node, manager) => {} 它仍然不起作用。它显示如下:imgur.com/a/McW0Xv8
  • 我需要创建一个模块,比如 discord.js 还是什么?
  • @PoProstuMieciek 在 cmets 中读取代码并有效解析它是不可能的。请编辑您的问题以包含这些新信息,以便我自己和社区的其他成员可以有效地阅读它。
  • 对不起,现在有问题了
  • @PoProstuMieciek 对我来说无法重现。正如您在 JSDoc 评论中声明的那样,我得到了正确的 IntelliSense,请参阅screenshot
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-03-19
  • 2020-07-05
  • 2019-01-31
  • 1970-01-01
  • 1970-01-01
  • 2020-06-22
相关资源
最近更新 更多