Javascript 闭包编译器externs解决了一个问题,但我没有';我不明白为什么?
我用闭包编译器编译我的源代码,当我调用从网络获取事件对象的函数时,应用程序在控制台中抛出一个错误 调用的函数是:Javascript 闭包编译器externs解决了一个问题,但我没有';我不明白为什么?,javascript,google-closure-compiler,google-closure,google-closure-library,Javascript,Google Closure Compiler,Google Closure,Google Closure Library,我用闭包编译器编译我的源代码,当我调用从网络获取事件对象的函数时,应用程序在控制台中抛出一个错误 调用的函数是: /** * @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 e
/**
* @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;
[...]
}
这是我所期望的行为。
现在,我将这样一个外部声明添加到我的外部文件,但我没有更改函数@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
的外部函数来解决编译器问题。。。
有人能解释为什么会这样吗?这是一个常见的误解。如果任何外部对象包含同名属性,则闭包编译器不会重命名属性。看。如果启用了基于类型的优化,那么这就不再是真的,我希望您的代码会再次中断 要使此代码类型安全且编译时不会出现警告,您需要:
event.data[0]['category']
引用数据属性。使用此方法(JSON数据经常使用)的编译器永远不会重命名您的属性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 = [];
/**
*@constructor
*@extends{goog.events.Event}
*/
de.my.app.AdminEvent=函数(){};
goog.inherits(de.my.app.AdminEvent,goog.events.Event);
/**@type{Array.}*/
de.my.app.AdminEvent.prototype.data=[];
根据具体情况,接口可能是更好的选择
/**
* @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 = [];