在JS文档中是否有一种定义通用类型的方法?

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> 扩展自 MyArray<T>
请使用这个很棒的数组类来计算鸟的数量。

JSDuck是否有实现这种功能的方法?如果没有,是否有一些可以为我完成此操作的JS文档生成器?请假定它应该像JSDuck一样灵活,以确保我能够使用任意类继承模式。

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 等等。但是,通过使用 --external=T,很容易让 JSDuck 忽略某些类型(或类型变量)。
一点补充,闭包编译器不支持在类型变量中使用 extends 语法,我也不太明白为什么你会写 T extends Bird 然后再写 {MyArray<T>},而不是直接写 {MyArray<Bird>}

感谢您提供的信息。我不会使用自定义标签,因为在所有编程语言中,通用类型逻辑都非常复杂。这可能是一个大项目。您关于“--external=T”的建议非常有用。 - Egor Nepomnyaschih
1
编写 BirdArray<T extends Bird> 的原因是,您可以在此实现中定义显式的 BirdArray<Duck>,而不仅仅是抽象的 BirdArray - Egor Nepomnyaschih

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接