闭包编译器外部解决了一个问题,但我不明白为什么
closure compiler externs solves an issue but i didn't understand why?
我用闭包编译器编译源代码,当我调用从网络获得事件对象的函数时,应用程序在控制台上抛出错误。
调用的函数是:
/**
* @param {goog.events.Event} event Socket.io-Wrapper Event.
*/
de.my.app.admin.prototype.onSaved = function(event){
var category = event.data[0].category; //<-- here it throws the error because category get compiled.
var id = event.data[0].id;
var oldid = event.data[0].oldid;
[...]
}
事件对象看起来像这样
{ data:{
0: {
category: 'someString',
id: 5,
oldid: -5
} }
[...someMoreValuesAddedBySocketIO...]
}
这是我所期望的行为
现在我添加了一个像这样的externs声明到我的externs文件,但我没有改变@param
在函数的类型声明,错误消失:
var xterns;
/**
* @typedef {{
* category : string,
* oldid : number,
* id : number
* }}
*/
xterns.NOTUSEDNAME;
/**
* @type {string}
*/
xterns.NOTUSEDNAME.prototype.category;
/**
* @type {number}
*/
xterns.NOTUSEDNAME.prototype.oldid;
/**
* @type {number}
*/
xterns.NOTUSEDNAME.prototype.id;
简而言之:我有一个@param {goog.events.Event} event
声明和xterns.NOTUSEDNAME
的外部解决编译问题…有人能解释一下为什么会这样吗?
这是一个常见的误解。如果任何 extern对象包含相同名称的属性,闭包编译器将不会重命名属性。请参阅FAQ。如果启用了基于类型的优化,那么这将不再是真的,并且我预计您的代码将再次中断。
要使此代码类型安全且编译时没有警告,您需要:
-
使用引号语法
event.data[0]['category']
引用数据属性。你的属性将永远不会被编译器使用这个方法(JSON Data经常使用)重命名。 -
使用自定义对象扩展
goog.events.Event
类型,该对象将数据对象定义为强类型数组。
的例子:
/**
* @constructor
* @extends {goog.events.Event}
*/
de.my.app.AdminEvent = function() {};
goog.inherits(de.my.app.AdminEvent, goog.events.Event);
/** @type {Array.<{category:string, id:number, oldid:number}>} */
de.my.app.AdminEvent.prototype.data = [];
根据具体情况,界面可能是更好的选择。
相关文章:
- 为什么不'我的窗口滚动事件根本没有启动.其他答案没有解决问题
- MathJax正在复制我的方程式——为什么以及如何解决这个问题
- 为什么JavaScript中存在单态和多态性问题
- 为什么我在以编程方式打开窗口时遇到问题
- 我的代码很完美,但我现在不知道为什么我发现了问题
- 为什么我在对话框中遇到Ajax请求问题
- 为什么我不能强制下载受污染的画布,为什么这是一个安全问题
- 为什么这不起作用?我认为这是一个转换问题
- 页面刷新后javascript内存泄漏有问题吗?为什么?
- 我的ajax加载栏出了什么问题?为什么它不能正常工作
- 为什么我得到cordova建立android问题'意外的令牌'
- 为什么我的setInterval有问题
- Javascript计数器的增量超过1.为什么?我该如何解决这个问题
- 为什么网址变量会导致 ajax 相对网址出现问题
- 为什么这个外部民意调查上的问题被包装了
- 这个javascript日期解析有什么问题?为什么 js 讨厌数字 8
- JavaScript闭包问题:为什么第二次调用outerFn会创建一个新的outerVar实例?
- JavaScript闭包问题:为什么第二次调用outerFn会创建一个新的outerVar实例?
- Jquery还是HTML问题?为什么不是'我的选择器不工作
- JQuery问题:为什么't $(document).scroll()不能在IE中工作?