2011-11-18 61 views
2

以下示例代码在高级优化上生成编译器警告:“JSC_UNSAFE_NAMESPACE:为名称空间NS创建的不完整别名”。如果我删除@enum注释,它不会给出警告。Closure编译器使用名称空间枚举发出警告

var NS = {}; 

/** 
* @enum {string} 
*/ 
NS.type = { 
    FOO : 'bar' 
}; 

NS.foobar = function(){ alert(NS.type.FOO); }; 

window['NS'] = NS; 
window['NS']['foobar'] = NS.foobar; 

仅导出功能,而不是命名空间也似乎工作:

window['NS_foobar'] = NS.foobar; 

我在做什么错?有没有解决的办法?如果可能,我宁愿不包含Closure库。

回答

2

编译器预计将枚举值折叠成单一变量:

NS.type.FOO成为NS $类型$ FOO。您导出的“NS”不包含您所期望的内容。

我怀疑你想是这样的:

window['NS'] = {}; // an external namespace object. 
window['NS']['foobar'] = NS.foobar; // add 'foobar' to the external namespace.