Запретить компилятору Google Closure переименовывать объекты настроек

Я пытаюсь заставить компилятор Google Closure не переименовывать объекты при передаче в качестве настроек или данных функции. Посмотрев на аннотации, представленные в jQuery, я подумал, что это сработает:

/** @param {Object.} data */
window.hello = function(data) {
    alert(data.hello);
};
hello({ hello: "World" });

Однако все заканчивается так:

window.a = function(b) {
  alert(b.a)
};
hello({a:"World"});

Функция ajax , найденная здесь , имеет эту аннотацию и похоже, работает. Итак, почему этого не произойдет? Если данные - это возвращаемое значение из внешнего источника или объекта настроек, я хотел бы иметь возможность указать компилятору не трогать их, используя трюк this ["escape"] для чего-то навязчивого. вот так на мой взгляд.

Вот лучший пример

function ajax(success) {
      // do AJAX call
    $.ajax({ success: success });
}
ajax(function(data) {
    alert(data.Success);
});

Результат:

$.b({c:function(a){alert(a.a)}});

успех был переименован в c , а Успех (с большой буквы) был переименован в a .

Теперь я компилирую тот же код с файлом externs jQuery 1.6 и получаю следующий результат:

$.ajax({success:function(a){alert(a.a)}});

Он также выдает предупреждение о том, что свойство Success не определено, поскольку Я ожидал, но он не может переименовать Success в просто a , что все равно нарушит мой код. Я просматриваю аннотацию ajax и нахожу это выражение типа {Object. =} , аннотирую свой код соответствующим образом и перекомпилирую. Все еще не работает ...

13
задан John Leidegren 19 October 2011 в 16:40
поделиться