以下示例代码在高级优化时生成编译器警告:“JSC_UNSAFE_NAMESPACE:为命名空间NS创建的不完整别名”。如果我删除了@enum注释,它就不会发出警告。
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库。
答案 0 :(得分:2)
编译器期望将枚举值折叠为单个变量:
NS.type.FOO成为NS $ $ $ FOO。您导出的“NS”不包含您期望的内容。
我怀疑你想要这样的东西:
window['NS'] = {}; // an external namespace object.
window['NS']['foobar'] = NS.foobar; // add 'foobar' to the external namespace.