如何在Visual Studio Code中对事件使用JSDoc自定义EventEmitter?

Nov*_*ova 5 node.js jsdoc eventemitter visual-studio-code es6-class

我一直在研究Node.js项目,只是注意到Visual Studio Code提供了有关基本EventEmitter对象的信息。因此,我想也应该为自定义代码提供JSDoc。

内置事件的屏幕截图

我已经尝试遵循JSDoc http://usejsdoc.org/tags-event.html文档,但是似乎没有发现。

自定义事件的屏幕截图

我不知道这是否会影响它,但我使用的是ES6类,其中事件在其外部的函数中进行处理,但在同一脚本中。

这是测试代码。

// voice
if (voice) {
  try {
    /**
     * Voice event.
     *
     * @event TelegramBot#voice
     * @type {object}
     * @property {object} chat - [object Chat]
     * @property {number} date - Date when content was sent.
     * @property {object} from - [object User]
     * @property {number} message_id - Message id.
     * @property {string} caption - Caption added to message. Value is undefined if none is added.
     * @property {object} voice - [object Voice]
     */
    context.emit('voice', chat, date, from, message_id, caption, voice)
  } catch (error) {
    context.emit('error', error)
  }
}
Run Code Online (Sandbox Code Playgroud)

Seb*_*lor 4

我在尝试做同样的事情时发现了这个问题,所以我继续搜索,并找到了一个可能的解决方案,通过重写方法addListener并记录它们。

我成功地使其适用于 NodeJS 和浏览器 JS。

VSCode 中的结果

在此输入图像描述

类型定义

首先,使用您的事件名称创建 typedef :

/**
 * @typedef {["someEvent" | "someOtherEvent", ...any[]]} eventsDef
 */
Run Code Online (Sandbox Code Playgroud)

我正在使用扩展语法,因为我不知道用户将传递多少参数给该方法。

执行

对于 NodeJS:

该类需要重写on和addListener方法,记录参数,并简单地调用父类自己的方法:

class Test extends EventEmitter {

  /**
   * @param {eventsDef} args
   */
  addListener(...args) {
    super.addListener(...args);
  }

  /**
   * @param {eventsDef} args
   */
  on(...args) {
    super.on(...args);
  }

  fireEvent() {
    this.emit("someEvent", "someValue");
  }
}
Run Code Online (Sandbox Code Playgroud)

然后你可以像这样使用这个类:

const t = new Test();

t.on("someEvent", (val) => console.log(val));

t.fireEvent(); // Outputs "someValue"
Run Code Online (Sandbox Code Playgroud)

对于浏览器:

该类需要扩展EventTarget并重写该addEventListener方法。

这是片段:

/**
 * @typedef {["someEvent" | "someOtherEvent", ...any[]]} eventsDef
 */
Run Code Online (Sandbox Code Playgroud)
class Test extends EventEmitter {

  /**
   * @param {eventsDef} args
   */
  addListener(...args) {
    super.addListener(...args);
  }

  /**
   * @param {eventsDef} args
   */
  on(...args) {
    super.on(...args);
  }

  fireEvent() {
    this.emit("someEvent", "someValue");
  }
}
Run Code Online (Sandbox Code Playgroud)

  • 我希望对“@event”和“@fires”有原生智能感知支持 (4认同)