使用Google Closure定义配置对象的最佳方法

时间:2010-10-27 19:36:04

标签: javascript google-closure google-closure-compiler

我喜欢Google Closure编译器如何优化代码中的符号。但是,我还没有找到一种很好的方法来定义将配置对象作为参数的公共导出函数。请考虑以下代码段:

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>

如果编译,这将失败,因为id和clazz属性已被压缩。

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

2 个答案:

答案 0 :(得分:1)

我的建议是简单地将参数注释为{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']);
} 

答案 1 :(得分:1)

关于受损和原始财产名称的冲突

你必须要么:

  • “extern”您的属性名称(以便不会重命名)
  • 使用“括号记”来获取资产

关于配置对象

根据Closure Compiler文档,目前你不能这样做。你必须将param标记为Object。

可以定义一个类型,但它不会对你有帮助,因为一个类型需要 all 存在的属性,但你可能只设置一些参数配置对象。

Closure Compiler文档建议您将参数标记为Object,但记录注释中的字段。