如何从 NodeJS 文件中正确导出 类?

How to properly export classes from NodeJS file?

我想在以下文件中导出我的 类。我试过这个:

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 代码的 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 工作?

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

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

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

一个快速解决方法(不推荐)如下(​​“命名”?/解构要求)。

我不知道为什么这行得通而 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 and/or TypeScript 内部发生了什么会导致这种行为——我的理解是这些代码片段是等效的。