Javascript 使用Google闭包定义配置对象的最佳方法

Javascript 使用Google闭包定义配置对象的最佳方法,javascript,google-closure,google-closure-compiler,Javascript,Google Closure,Google Closure Compiler,我喜欢谷歌闭包编译器如何优化代码中的符号。但是,我还没有找到一种好方法来定义将配置对象作为参数的公共导出函数。考虑这个代码片段: goog.provide('foo'); goog.require('goog.dom'); /** @typedef {{ * id : string, * clazz : string * }} */ foo.config; /** * Does some neat stuff

我喜欢谷歌闭包编译器如何优化代码中的符号。但是,我还没有找到一种好方法来定义将配置对象作为参数的公共导出函数。考虑这个代码片段:

goog.provide('foo');
goog.require('goog.dom');

/** @typedef {{
 *              id : string,
 *              clazz : string
 *           }}
 */
foo.config;

/**
 * Does some neat stuff
 * @param {foo.config} config
 */    
foo.myFoo = function(config) {
    var el = goog.dom.getElement(config.id);
    goog.dom.classes.add(el, config.clazz);
} 
goog.exportSymbol('foo.myFoo', foo.myFoo);
现在假设我们加载此脚本,并希望按如下方式调用myFoo:

<script type="text/javascript">
foo.myFoo({
    id: 'unique-id',
    clazz: 'pretty'
});
</script>

foo.myFoo({
id:“唯一id”,
克拉兹:“漂亮”
});
如果编译,这将失败,因为id和clazz属性被压缩


有人知道使用Google Closure编译器实现和导出配置对象的优雅方法吗?

我的建议是简单地将参数注释为
{Object}
,并引用键,如下所示:

foo.myFoo({
    'id': 'unique-id',
    'clazz': 'pretty'
});

...

/**
 * Does some neat stuff
 * @param {Object} config
 */    
foo.myFoo = function(config) {
    var el = goog.dom.getElement(config['id']);
    goog.dom.classes.add(el, config['clazz']);
} 
关于损坏和原始财产名称的冲突

您必须:

  • “外部”属性名称(这样它们就不会被重命名)
  • 使用“括号表示法”访问属性
关于配置对象

根据闭包编译器文档,目前您无法执行此操作。必须将参数标记为对象

您可以定义一个类型,但它对您没有帮助,因为一个类型需要所有属性存在,但您只能在一个配置对象中设置几个参数


闭包编译器文档建议您将参数标记为对象,但在注释中记录字段。

谢谢!我试着解决同样的问题,结果成功了。但我不确定我是否理解为什么编译器在使用点表示法时混淆属性名称,而在使用方括号表示法时却不混淆属性名称。我知道方括号表示法允许变量,但编译器不会混淆这些变量吗?为什么要将参数更改为“Object”?他的类型定义很好,他所要做的就是声明一个extern或使用字符串文本:
config['id']
而不是
config.id
。删除适当的类型定义意味着,如果他曾经从编译代码中调用函数,他将不会进行任何类型检查。不是吗?我对注释的理解是,人类使用注释来理解一种方法,就像更优雅的注释行一样。更重要的是,如果该方法使用不当,它允许谷歌抛出错误。