为什么Closure编译器重命名extern类型的属性?

Rob*_*b N 12 javascript google-closure-compiler

我把它放在externs文件中:

/** @typedef {{english: string, spanish: string}} */
var SpanishNoun;
Run Code Online (Sandbox Code Playgroud)

然后我有javascript:

/**
 * @param {SpanishNoun} n 
 */
exp1.processData3 = function (n) {
    console.log("pd3:", n.english, n.spanish, n['english'], n['spanish']);
}
Run Code Online (Sandbox Code Playgroud)

编译为:

function(a){console.log("pd3:",a.a,a.c,a.english,a.spanish)};
Run Code Online (Sandbox Code Playgroud)

所以它仍然将'英语'重命名为'a'等等.你如何阻止它?为什么它认为它可以重命名"外部"的东西.

后续问题

John的回答引出了另一个问题:我可以告诉Closure编译器,仅针对特定类型,停止重命名属性吗?

Joh*_*ohn 5

typedef不参与重命名计算

此类型定义将:

/** @interface */
function SpanishNoun() {}
/** @type {string} */
SpanishNoun.prototype.english;
/** @type {string} */
SpanishNoun.prototype.spanish;
Run Code Online (Sandbox Code Playgroud)

  • @Rob N - 这是Closure的标准行为,以避免错误(您可以阅读Closure网站以了解为什么这是必要的).Closure总是将相同的属性名称重命名为相同的受损名称.另一方面,它不会重命名同名的所有属性(无论在哪里) - 因为实质上非重命名只是重命名为自身.有一个标志,你可以打开避免这个,但它只是实验性的. (2认同)