Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/449.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 闭包编译器externs解决了一个问题,但我没有';我不明白为什么?_Javascript_Google Closure Compiler_Google Closure_Google Closure Library - Fatal编程技术网

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 = [];