node.js - JSDoc:适用于孙子类的文档通用类型

标签 node.js webstorm jsdoc

记录泛型类型适用于直接继承。但是当我有一个继承链时,没有办法让它适用于孙子类。这是一个例子:

 * @property {string} color
 * @template {T}
 */
class MyColor {
  constructor() {
    this.color = 'unknown';
  }

  /**
   * @returns {T}
   */
  static makeColor() {
    return /**@type {T}*/ new this.prototype.constructor();
  }
}

/**
 * @extends MyColor<Red>
 * @template {T}
 */
class Red extends MyColor {
  constructor() {
    super();
    this.color = 'red';
  }
}

/**
 * @extends Red<DarkRed>
 */
class DarkRed extends Red {
  constructor() {
    super();
    this.level = 2;
  }

  darker() {
    this.level += 1;
  }
}

const circle = DarkRed.makeColor();

DarkRed.makeColor 仅将返回值识别为 Red,但不识别 DarkRed。有没有办法让它与@template一起工作?或者还有其他方法可以让它发挥作用吗?

我使用 WebStorm 作为 IDE。

最佳答案

来自https://github.com/google/closure-compiler/wiki/Generic-Types#inheritance-of-generic-types , @extends MyColor<Red> “修复”模板类型而不是将其传播到继承类型。例如,在

/**
 * @constructor
 * @template T
 */
var A = function() { };

/** @param {T} t */
A.prototype.method = function(t) {  };

/**
 * @constructor
 * @extends {A<string>}
 */
var B = function() {  };

/**
 * @constructor
 *
 * @extends {B<number>}
 */
var C = function() {  };


var cc =new C();
var bb = new B();

var bm = bb.method("hello");
var cm = cc.method(1);

cc.method(1)将导致TYPE_MISMATCH: actual parameter 1 of A.prototype.method does not match formal parameter found : number required: string

您可以尝试将代码更改为

/**
* @property {string} color
 * @template {T}
 */
class MyColor {
  constructor() {
    this.color = 'unknown';
  }

  /**
   * @returns {T}
   */
  static makeColor() {
    return /**@type {T}*/ new this.prototype.constructor();
  }
}

/**
 * @extends MyColor<T>
 * @template {T}
 */
class Red extends MyColor {
  constructor() {
    super();
    this.color = 'red';
  }
}

const circle1 = Red.makeColor();

/**
 * @extends Red<DarkRed>
 *
 */
class DarkRed extends Red {
  constructor() {
    super();
    this.level = 2;
  }

  darker() {
    this.level += 1;
  }
}

const circle = DarkRed.makeColor();

另一种可能的解决方案是使用@return {this}而不是@template (自 2018.2 起生效):

class MyColor {
  constructor() {
    this.color = 'unknown';
  }

  /**
   * @return {this}
   */
  static makeColor() {
    return  new this.prototype.constructor();
  }
}


class Red extends MyColor {
  constructor() {
    super();
    this.color = 'red';
  }
}

class DarkRed extends Red {
  constructor() {
    super();
    this.level = 2;
  }

  darker() {
    this.level += 1;
  }
}

关于node.js - JSDoc:适用于孙子类的文档通用类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51088894/

相关文章:

node.js - 如何在一个 gulp 任务中创建多个文件

mysql - 如何使用 sinon 模拟 promisified Mysql 数据进行单元测试

javascript - 如何让 WebStorm 正确查看包功能?

javascript - 调试时是否可以隐藏JavaScript框架调用栈,只跨过应用JavaScript代码

javascript - jsDoc - 如何指定数组长度

javascript - 如何从 node_modules 导入 JS 库

javascript - 如何获取NodeJS子进程以通过CMD.exe运行.bat文件

angularjs - index.html 不保存(使用 WebStorm、Yeoman 和 Angular)

javascript - 将 JSDoc 与命名空间和函数定义的变体形式结合使用

javascript - 是否可以告诉 jsdoc 在与源代码分开的文件中查找该代码的文档?