记录通过函数生成的类(混合)

Mec*_*awa 7 javascript jsdoc

我正在尝试记录以下代码,但我似乎无法使 JSDoc 记录该类,甚至无法引用它的存在。

// SomeMixin.js 
export default superclass => class SomeMixin extends superclass {
   // class code goes here
   func() {}
};
Run Code Online (Sandbox Code Playgroud)
import SomeMixin from './SomeMixin';
import { EventEmitter } from 'events';

/**
 * @param {SomeMixin} bar
 */
function foo(bar) {

}

class MyClass extends SomeMixin(EventEmitter) {}

const item = new MyClass();

foo(bar);
Run Code Online (Sandbox Code Playgroud)

我如何记录这段代码,以便 JSDoc 看到它SomeMixin可以被继承(是一个类),并且当我创建一个MyClass它的实例时,它继承了方法func

str*_*605 4

更新

在/sf/answers/3663505471/的帮助下我得到了:

// SomeMixin.js
/**
 * @template T
 * @typedef {new(...args: any[]) => T} Constructor
 **/

/**
 * @template {Constructor<{}>} T
 * @param {T} superclass
 */
function mixin(superclass) {
  return class SomeMixin extends superclass {
    // class code goes here
    func() {}
  };
}

export default mixin
Run Code Online (Sandbox Code Playgroud)
// index.js
import createMixin from "./SomeMixin";
import { EventEmitter } from "events";

/**
 *
 * @param {MyClass} bar
 */
function foo(bar) {
  bar;
}

class MyClass extends createMixin(EventEmitter) {}

const item = new MyClass();

foo(item);
Run Code Online (Sandbox Code Playgroud)

解决方案2


这是我尝试过的一个版本。不是最好的解决方案,但在 VSCode 中我可以func看到EventEmitter.

// SomeMixin.js
import { EventEmitter } from "events";

/**
 * @param {EventEmitter} superclass
 */
function mixin(superclass) {
  /**
   * @extends EventEmitter
   */
  class SomeMixin extends superclass {
    // class code goes here
    func() {}
  }

  return SomeMixin;
}

export default mixin;
Run Code Online (Sandbox Code Playgroud)
// index.js
import SomeMixin from "./SomeMixin";
import { EventEmitter } from "events";

class MyClass extends SomeMixin(EventEmitter) {}

const item = new MyClass();
Run Code Online (Sandbox Code Playgroud)

解决方案1

但仍然需要弄清楚如何使用通用类型。也许这个问题可能会有所帮助。