奇怪的对象 属性 闭包编译器的行为 ADVANCED_OPTIMIZATIONS

strange object property behavior with closure compiler ADVANCED_OPTIMIZATIONS

当 运行 使用 ADVANCED_OPTIMIZATIONS 编译以下代码时,我得到了意外的输出(至少对我而言)。

/**
 * @typedef {{
 *      version: string,
 *      api_host: string
 * }}
 */
var AppProps;

/**
 * 
 * @param {AppProps} props 
 */
window['app'] = function(props) {
    props = props || {};
    console.log("props.api_host = ", props.api_host);
    console.log("props['api_host'] = ", props['api_host']);
};

结果:

props.api_host =  undefined 
props['api_host'] =  http://localhost:8080

这是编译对象文字的预期行为吗?我是否应该始终对对象属性使用字符串访问器(我几乎从不这样做)?

任何对此行为的见解都将不胜感激。

干杯,谢谢!

PS: 闭包编译器版本是 v20191111,除了 @typedef 之外,编译器对传入的对象文字的了解为 0。函数调用发生在编译代码之外。

PPS:这里是重写的代码,解释了输出,但不解释推理。

console.log("props.api_host \x3d ",a.B);
console.log("props['api_host'] \x3d ",a.api_host)

鉴于提供的@typedef,我不希望闭包编译器按原样重写第一条语句。我在这里做错了什么?

阅读文档并仔细考虑我的设置后,我发现了我的方法的错误,并对结果进行了令人满意的解释。

由于编译代码中的所有内容(包括我的@typedef)都可能被重写,所以我实际需要的是一个 extern 来描述这个外部提供的对象的形状。

externs.js

/**
 * @interface
 */
function AppProps() {}

/**
 * @type {string}
 */
AppProps.prototype.version;

/**
 * @type {string}
 */
AppProps.prototype.api_host;

app.js

/**
 * 
 * @param {AppProps} props 
 */
window['app'] = function(props) {
    props = props || {};
    console.log("props.api_host = ", props.api_host);
    console.log("props['api_host'] = ", props['api_host']);
};

结果输出现在按预期工作。