我在JavaScript中创建了一个类工厂,它采用类型T并生成一个新的类型为T的增强类,简单。如何在JavaScript中注释扩展泛型的类,使用闭包编译器
我正在使用谷歌的闭包编译器来编译javascript,以及用于注释类型的闭包注解等。挑战在于如何注释一个扩展类型T的类,其中T是泛型类型。
这里是扩展其他类型的简化类Enhanced
:
/**
* @constructor
*/
function Foo(){
this.x = 'x';
};
/**
* @constructor
*/
function Bar(){
this.y = 'y';
};
/**
* @constructor
* @param {function(new:T)} FooOrBar
* @extends {T}
* @template T
*/
function Enhanced(FooOrBar){
FooOrBar.call(this);
this.z = 'z';
};
/** @type Enhanced.<Foo> */
var enhancedFoo = new Enhanced(Foo);
/** @type Enhanced.<Bar> */
var enhancedBar = new Enhanced(Bar);
当我编译这个代码与封闭的编译器,我得到一个编译器警告:
“不能在解决型@扩展了Enhanced的标签。
所以,显然编译器不知道从何处推断T何时编译此类。
有人请指出为什么编译器无法推断出类型创建类的时候,或者如果有注释生成的类作为
我不认为我们支持这样的情况。我们希望在编译时知道继承层次结构:也就是说,可以扩展Foo或扩展Bar,但不要说“我在扩展Foo或Bar,不知道哪个是。”你能描述一下你为什么要这样做吗?也许还有另一种方式,比如让Foo和Bar实现相同的界面。 – MatrixFrog
MatrixFrog,我的用例是Class工厂,因为它们是在运行时创建的,所以类不能被注释。唯一的方法是创建一个虚拟类(接口不能扩展),它扩展了,其中T是泛型类型(模板类型),并且将工厂的返回类型标注为'{function(new:Enhanced )}'其中'Enhanced'扩展'T' –