¿Puedo decirle al compilador de Closure que, solo para tipos específicos, deje de cambiar el nombre de las propiedades?
Esta pregunta sigue: ¿Por qué el compilador Closure renombra las propiedades de un tipo externo? La respuesta de John a esa pregunta plantea esta segunda pregunta.
Si declaro el tipo externo como se sugiere:
/** @interface */
function SpanishNoun() {}
/** @type {string} */
SpanishNoun.prototype.english;
/** @type {string} */
SpanishNoun.prototype.spanish;
then Javascript como:
/**
* @param {SpanishNoun} n
*/
exp.foo = function (n) {
console.log(n.english, n.spanish, n['english'], n['spanish']);
}
compilará, según lo desee, para:
function(a){console.log(a.english,a.spanish,a.english,a.spanish)};
Las propiedades no se renombran como de costumbre. Sin la declaración externa, el código compilado se vería así:
function(a){console.log(a.a,a.c,a.english,a.spanish)
Eso está todo bien. El problema es que el compilador ha dejado de cambiar el nombre de 'inglés' y 'español' entodo lugares. Incluso si no están en el tipo externo.
/**
* @param {AnotherType}
*/
exp.bar = function (c) {
c.other = c.english;
}
compila a ...
function(a){a.b=a.english};
¿Hay alguna forma de detener esto? Si no, ¿hay alguna razón para este comportamiento?
Quería usar tipos externos para manejar cosas como objetos JSON que se originan en el servidor y no tienen propiedades renombradas. Pero si cada vez que declaro un externo, estoy consumiendo la capacidad del compilador para cambiar el nombre y reducir el código, encontraré otra forma. Tal vez tomaré el mapa de cambio de nombre de propiedad generado por el compilador --property_map_output_file
) y úselo en el servidor al generar respuestas JSON.