Google Closure编译器:类作为函数参数

问题描述 投票:0回答:1

我不知道如何将类引用作为函数参数发送,以便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);
}
javascript google-closure-compiler jsdoc
1个回答
0
投票

要传递课程,可以使用{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

欢呼声。

© www.soinside.com 2019 - 2024. All rights reserved.