Закрытие Компилятор выдает предупреждение с перечислением пространства имен - PullRequest
3 голосов
/ 18 ноября 2011

В следующем примере кода генерируется предупреждение компилятора о расширенной оптимизации: «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 Ответ

2 голосов
/ 21 ноября 2011

Компилятор ожидает свернуть значение перечисления в отдельные переменные:

NS.type.FOO становится NS $ типа $ FOO. «NS», который вы экспортировали, не будет содержать то, что вы ожидаете.

Я подозреваю, что вы хотите что-то вроде этого:

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