Следующий вопрос: Почему компилятор Closure переименовывает свойства типа extern? Ответ Джона на этот вопрос поднимает второй вопрос .
Если я объявлю тип extern, как предлагается:
/** @interface */
function SpanishNoun() {}
/** @type {string} */
SpanishNoun.prototype.english;
/** @type {string} */
SpanishNoun.prototype.spanish;
, то Javascript, например:
/**
* @param {SpanishNoun} n
*/
exp.foo = function (n) {
console.log(n.english, n.spanish, n['english'], n['spanish']);
}
, будет компилироваться, как требуется, в:
function(a){console.log(a.english,a.spanish,a.english,a.spanish)};
Свойства не переименовываются как обычно.Без объявления extern скомпилированный код выглядел бы так:
function(a){console.log(a.a,a.c,a.english,a.spanish)
Все хорошо. Проблема в том, что компилятор перестал переименовывать «английский» и «испанский» в всех местах. Даже если они не относятся к внешнему типу.
/**
* @param {AnotherType}
*/
exp.bar = function (c) {
c.other = c.english;
}
компилируется в ...
function(a){a.b=a.english};
Есть способ остановить это? Если нет, то есть ли причина для такого поведения?
Я хотел использовать типы extern для обработки таких вещей, как объекты JSON, которые происходят с сервера и не имеют переименованных свойств. Но если каждый раз, объявляя extern, я съедаю способность компилятора переименовывать и сжимать код, я найду другой способ. Возможно, я возьму карту переименования свойств, сгенерированную компилятором ( - property_map_output_file
), и буду использовать ее на сервере при генерации ответов JSON.