Closure Compiler使用命名空间枚举发出警告

时间:2011-11-18 06:01:13

标签: google-closure-compiler

以下示例代码在高级优化时生成编译器警告:“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库。

1 个答案:

答案 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.