7

我正在为我的 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<T>
我完美的数组类。

BirdArray<T extends Bird > extends MyArray <T>
请使用这个很棒的数组类来计算鸟类。

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

4

1 回答 1

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());

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

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

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

于 2013-09-12T06:32:55.387 回答