有没有办法在JS文档中定义泛型类型?

Ego*_*hih 6 javascript generics documentation jsdoc jsduck

我正在为我的JS库寻找文档生成器.我发现JSDuck是最全面和最强大的.但我没有看到使用其语法为泛型类和函​​数定义类型变量的方法.快速浏览流行的JS文档生成器让我觉得他们都没有能力做到这一点.这是我正在寻找的一个伪示例:

/**
 * @class MyArray
 * My perfect array class.
 * @typevar T
 */
MyArray = function() ...

/**
 * @class BirdArray
 * Please count birds using this awesome array class.
 * @typevar T extends {Bird}
 * @extends {MyArray<T>}
 */
BirdArray = function() ...
extend(BirdArray, MyArray);
Run Code Online (Sandbox Code Playgroud)

样本输出:

MyArray <T>
我完美的数组类.

BirdArray <T extends Bird >扩展MyArray <T>
请使用这个真棒数组类来计算鸟类.

有没有办法在JSDuck中实现这一目标?如果没有,是否有一些JS文档生成器可以为我做到这一点?请假设它应该像JSDuck一样通用,以确保我能够使用任意类继承模式.

Ren*_*soo 5

有趣的是,Google Closure Compiler支持泛型类型,语法如下:

/**
 * @constructor
 * @template T
 */
Foo = function() { ... };

/** @return {T} */
Foo.prototype.get = function() { ... };

/** @param {T} t */
Foo.prototype.set = function(t) { ... };

/** @type {!Foo.<string>} */ var foo = new Foo();
var foo = /** @type {!Foo.<string>} */ (new Foo());
Run Code Online (Sandbox Code Playgroud)

由于 JSDuck已经支持Closure Compiler 风格的类型注解,应该已经可以编写像{MyClass.<T>}. 然而,JSDuck 并没有将@template 标签用于完全不同的目的,而是实现自己的自定义标签,例如@typevar或覆盖内置标签@template以使用自定义标签系统进行出价。

但是由于 JSDuck 中没有实际的泛型类型支持,它不会检查您的泛型类型。相反,它可能会抱怨您引用的是未知类型T和其他类型。但是很容易通过使用 .jsduck 来让 JSDuck 忽略某些类型(或类型变量)--external=T

最后一点。Closure Compiler 不支持您extends在类型变量中的语法,而且我真的不明白您为什么要编写T extends Birdand then {MyArray<T>},而不是只编写{MyArray<Bird>}.