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



我正在为我的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);

示例输出:

MyArray
我完美的阵列课。

BirdArray

扩展了 MyArray
请使用这个很棒的数组类来计算鸟类。

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

有趣的是,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());

由于 JSDuck 已经支持闭包编译器样式类型注释,因此应该已经可以编写像 {MyClass.<T>} 这样的类型。但是,JSDuck 不会将 @template 标记用于完全不同的目的,而是实现自己的自定义标记(如 @typevar)或覆盖内置@template以使用自定义标记系统进行出价。

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

最后一点。闭包编译器不支持类型变量中的extends语法,我真的不明白为什么要先写T extends Bird然后{MyArray<T>},而不仅仅是写{MyArray<Bird>}

最新更新