这个问题如下:为什么闭包编译器要重命名外部类型的属性?约翰对这个问题的回答提出了第二个问题。
如果我按照建议声明 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)
这一切都很好。问题是编译器已停止重命名“english”和“spanish”all地方。即使它们不属于外部类型。
/**
* @param {AnotherType}
*/
exp.bar = function (c) {
c.other = c.english;
}
编译为...
function(a){a.b=a.english};
有办法阻止这种情况吗?如果不是,这种行为有原因吗?
我想使用 extern 类型来处理来自服务器且没有重命名属性的 JSON 对象之类的内容。但是,如果每次声明 extern 时,我都会削弱编译器重命名和缩小代码的能力,那么我会找到另一种方法。也许我会采用编译器生成的属性重命名映射(--property_map_output_file
)并在生成 JSON 响应时在服务器上使用它。