Javascript 如何定义该类的Google闭包编译器外部
我有以下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);;
类状态{
构造函数(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)
,因为它得出的结论是,它是死代码,因为编译后的代码中没有内部使用它。如何导出该静态方法
矩阵
属性标记为公共界面的一部分类状态{
/**
*@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.模块(“状态”)