Javascript 如何定义该类的Google闭包编译器外部

Javascript 如何定义该类的Google闭包编译器外部,javascript,google-closure-compiler,Javascript,Google Closure Compiler,我有以下JavaScript类定义,它可以正常工作,并且我使用Google闭包编译器进行编译: 类状态{ 构造函数(x,y,z,rotationX,rotationY){ 这个.x=x; 这个。y=y; 这个。z=z; 这是旋转x=旋转x; 这个。旋转Y=旋转Y; } 设置矩阵(值){ //魔力 } 获取矩阵(){ //更神奇 } 设置为红色(值){ this.setAttribute(attributer,value) } 变红{ 返回此.getAttribute(Attributed);;

我有以下JavaScript类定义,它可以正常工作,并且我使用Google闭包编译器进行编译:

类状态{
构造函数(x,y,z,rotationX,rotationY){
这个.x=x;
这个。y=y;
这个。z=z;
这是旋转x=旋转x;
这个。旋转Y=旋转Y;
}
设置矩阵(值){
//魔力
}
获取矩阵(){
//更神奇
}
设置为红色(值){
this.setAttribute(attributer,value)
}
变红{
返回此.getAttribute(Attributed);;
}
静态fromUrlSearchParams(searchParams){
返回新状态(parseInt(searchParams.get(“x”),10),
parseInt(searchParams.get(“y”),10),
parseInt(searchParams.get(“z”),10),
parseFloat(searchParams.get(“rotationX”),
parseFloat(searchParams.get(“rotationY”));
}
toUrlSearchParams(){
设searchParams=新的URLSearchParams();
searchParams.set(“x”,此为红色);
searchParams.set(“y”,this.green);
searchParams.set(“z”,此为蓝色);
searchParams.set(“rotationX”,this.pitch);
searchParams.set(“rotationY”,this.yaw);
返回搜索参数;
}
}
此类型是我的代码的公共接口的一部分,这意味着我必须阻止闭包编译器重命名其符号。我正在编写一个externs文件,使用
--externs
开关将其传递给闭包编译器。以下是我目前掌握的情况:

State=class{
/**
*@constructor
*@param{number}x
*@param{number}y
*@param{number}z
*@param{number}rotationX
*@param{number}旋转
*/
构造函数(x,y,z,rotationX,rotationY){
/**@type{number}*/
这个.x=x;
/**@type{number}*/
这个。y=y;
/**@type{number}*/
这个。z=z;
/**@type{number}*/
这是旋转x=旋转x;
/**@type{number}*/
这个。旋转Y=旋转Y;
}
//在此处插入属性导出。如果您知道如何。。。
/**@return{State}*/
静态fromUrlSearchParams(searchParams){}
/**@return{URLSearchParams}*/
toUrlSearchParams(){}
};
我在完成externs文件时遇到三个问题:

  • 构造函数的参数(
    x
    y
    z
    rotationX
    rotationY
    )被重命名。我需要做些什么来防止这种情况
  • 编译器删除了
    static
    方法
    fromUrlSearchParams(searchParams)
    ,因为它得出的结论是,它是死代码,因为编译后的代码中没有内部使用它。如何导出该
    静态方法
  • 如何将
    矩阵
    属性标记为公共界面的一部分
  • 编辑:

    在花了几个小时处理这个问题,阅读了我能找到的每一份文档,在GitHub上爬行文件,测试了各种在线外部生成器,并获得了一本书“Closure-the definal Guide”之后,这个问题仍然没有解决

    闭包编译器文档已经存在了十多年,但除了最基本的示例之外,它对任何东西都是无用的。你一定是在开玩笑

    以下是我迄今为止所做的尝试:

    类状态{
    /**
    *@constructor
    *@param{number}x
    *@param{number}y
    *@param{number}z
    *@param{number}rotationX
    *@param{number}旋转
    */
    构造函数(x,y,z,rotationX,rotationY){
    /**@type{number}*/
    这个.x=x;
    /**@type{number}*/
    这个。y=y;
    /**@type{number}*/
    这个。z=z;
    /**@type{number}*/
    这是旋转x=旋转x;
    /**@type{number}*/
    这个。旋转Y=旋转Y;
    }
    /**
    *@nocollapse
    *@param{URLSearchParams}searchParams
    *@return{State}
    */
    静态fromUrlSearchParams(searchParams){}
    /**@return{URLSearchParams}*/
    toUrlSearchParams(){}
    };
    
    与原始文件的不同之处在于使用了
    class State{
    而不是
    State=class{
    。有趣的是,这会导致以下错误消息:

    ERROR - [JSC_BLOCK_SCOPED_DECL_MULTIPLY_DECLARED_ERROR] Duplicate let / const / class / function declaration in the same scope is not allowed.
    
    不知道为什么会有不同,但无论如何,让我们继续。下一次尝试:

    /**
    *@constructor
    *@param{number}x
    *@param{number}y
    *@param{number}z
    *@param{number}rotationX
    *@param{number}rotationX
    */
    var State={};
    /**@type{number}*/
    State.prototype.x;
    /**@type{number}*/
    State.prototype.y;
    /**@type{number}*/
    State.prototype.z;
    /**@type{number}*/
    State.prototype.rotationX;
    /**@type{number}*/
    State.prototype.rotationX;
    /**
    *@nocollapse
    *@param{URLSearchParams}searchParams
    *@return{State}
    */
    State.fromUrlSearchParams=函数(searchParams){};
    /**@return{URLSearchParams}*/
    State.prototype.toUrlSearchParams=函数(){};
    
    使用该代码运行它会导致

    ERROR - [JSC_VAR_MULTIPLY_DECLARED_ERROR] Variable ColorCubeState declared more than once. First occurrence: blabla.js
    
    class State {
          ^^^^^
    
    好了,我们又来了。对于我来说,这是一个谜,为什么当我传递一个源文件和一个外部文件时,编译器会声明它已经被定义了。一个定义它,另一个注释它,或者你会这么想

    任何尝试都无法保存编译器删除的静态方法


    除了用我的代码构建和调试编译器之外,我看不到任何可以尝试的东西。幸运的是,这个问题有一个有保证的解决方案:不使用Google闭包编译器。

    我不是这方面的专家,但这里有一些东西可以尝试。另请参见

    在文件末尾,您可以尝试添加

    导出=状态

    您可能还需要在顶部添加:

    goog.模块(“状态”)

  • 为什么需要防止重命名构造函数的参数?这些参数在构造函数外部不可见,因此不应该是问题

  • 试试这个:

  • goog.exportSymbol('fromUrlSearchParams',fromUrlSearchParams)

  • JavaScript getter和set