我不知道如何将类引用作为函数参数发送,以便Google Closure编译器可以在高级模式下正确编译它。在下面的示例中,我发送了对Test1.doSomething函数的类引用,该函数在该类上调用静态函数。我将@param设置为Function,因为我猜它仍然是一个函数,尽管我使用ES6样式类。还有其他我应该使用的关键字吗?
下面的代码在未编译的情况下也可以正常工作,如果我上了老学校并将“ class Test2”更改为“ function Test2()”,也可以正常工作。我也尝试将@param更改为function(),function(new:Test2),function(this:Test2),typeof Test2等,但没有成功。
class Test1
{
/**
* @param {!Function} typeRef
*/
doSomething(typeRef)
{
typeRef.doSomething();
}
}
class Test2
{
}
Test2.doSomething = function()
{
alert(1);
}
var t1 = new Test1();
window["t1"] = t1;
t1.doSomething(Test2);
我编译如下:
--debug --formatting=PRETTY_PRINT --language_in ECMASCRIPT6_STRICT --language_out ECMASCRIPT6_STRICT --compilation_level ADVANCED_OPTIMIZATIONS --js Test.js --js_output_file Script.js
带有“ Test2类”的结果
'use strict';
class $Test1$$ {
}
window.t1 = new $Test1$$;
带有“函数Test2()的结果”
'use strict';
class $Test1$$ {
$doSomething$($typeRef$$) {
$typeRef$$.$doSomething$();
}
}
function $Test2$$() {
}
$Test2$$.$doSomething$ = function $$Test2$$$$doSomething$$() {
alert(1);
};
var $t1$$ = new $Test1$$;
window.t1 = $t1$$;
$t1$$.$doSomething$($Test2$$);
编辑1月29日:添加了我要执行的操作的更完整的示例:
class Car
{
constructor()
{
this.make = "Ford";
console.log("Car created.");
}
}
Car.create = function(registry)
{
let obj = new Car();
registry.add(obj);
return obj;
}
class Motorcycle
{
constructor()
{
this.make = "BMW";
console.log("Motorcycle created.");
}
}
Motorcycle.create = function(registry)
{
let obj = new Motorcycle();
registry.add(obj);
return obj;
}
class Registry
{
constructor()
{
this.vehicles = [];
}
add(vehicle)
{
this.vehicles.push(vehicle);
}
makeVehicle(typeRef)
{
typeRef.create(this);
}
}
function init()
{
var registry = new Registry();
registry.makeVehicle(Car);
registry.makeVehicle(Motorcycle);
registry.makeVehicle(Motorcycle);
registry.makeVehicle(Car);
registry.makeVehicle(Car);
}
要传递课程,可以使用{typeof namespace}
类型:
{typeof namespace}
与您的代码相同:
@param {typeof Test2} TypeRef
class Test1
{
/**
* @param {typeof Test2} TypeRef
*/
doSomething(TypeRef)
{
(new TypeRef()).doSomething();
}
}
class Test2
{
doSomething ()
{
alert(1);
}
}
var t1 = new Test1();
window["t1"] = t1;
t1.doSomething(Test2);
[使用Demo (don't forget to hit Compile)时(不使用@param
),您将传递该类型的实例*。这远比通过类本身更常见]
*:很抱歉,如果这无关紧要,但是我注意到原始代码中有几个问题,即使不相关,我也想向您展示如何解决它们;
要生成实例类型的版本,我必须更改3件事;
1)typeof
分配应分配给Test2.doSomething
;
Test2.prototype
或使用ES6类格式:
Test2.prototype.doSomething = function()
{
alert(1);
}
2)并为了解决警告,必须将Test2
{
doSomething()
{
alert(1);
}
}
的Test1.doSomething
注释变为@param
,因为Function未声明Type2
方法。
Function.doSomething
3)最后一行传递类本身,而不是类的实例,因此您应该使用/**
* @param {!Type2} typeRef
*/
运算符发送该类的实例。
new
欢呼声。