奇怪的对象 属性 闭包编译器的行为 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']);
};
结果输出现在按预期工作。
当 运行 使用 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']);
};
结果输出现在按预期工作。