Я пытаюсь заставить компилятор Google Closure не переименовывать объекты, переданные в качестве настроек или данных в функцию. Просмотрев аннотации, представленные в jQuery, я подумал, что это сработает:
/** @param {Object.<string,*>} 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)}});
success
был переименован в c
, а success
(с капиталом S) переименован в a
.
Теперь я скомпилирую тот же код с jQuery 1.6 externs file и получаю следующий вывод:
$.ajax({success:function(a){alert(a.a)}});
Он также выдает предупреждение о том, что свойство success
не определено, как я ожидал, но он не может переименовать success
просто a
, который все равно сломает мой код. Я смотрю представленную аннотацию для ajax
, и я нахожу это выражение типа {Object.<string,*>=}
, я комментирую свой код и перекомпилирую. Все еще не работает...