Я не могу понять, как отправлять ссылки на классы в качестве аргументов функции, чтобы компилятор Google Closure компилировал его прямо в расширенном режиме. В приведенном ниже примере я отправляю ссылку на класс в функцию Test1.doSomething, которая вызывает функцию класса c для класса. Я установил @param в Function, потому что я думаю, что это все еще функция, хотя я использую классы стиля ES6. Есть ли какое-то другое ключевое слово, которое я должен использовать?
Приведенный ниже код прекрасно работает без компиляции, а также отлично работает, если я go old school и заменю «class Test2» на «function Test2 ()». Я также пытался изменить @param на function (), function (new: Test2), function (this: Test2), typeof Test2, et c, но безуспешно.
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
Результат с "class Test2"
'use strict';
class $Test1$$ {
}
window.t1 = new $Test1$$;
Результат с "function 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$$);
EDIT ON 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);
}