Могу ли я сказать компилятору Closure прекратить переименование свойств только для определенных типов?

Следующий вопрос: Почему компилятор 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.

7
задан Community 23 May 2017 в 11:54
поделиться