Closure-compiler参数类型Object。<string,* =“”>不能按预期工作</string,>

时间:2013-12-19 05:08:55

标签: javascript google-closure-compiler

注释我可以作为函数参数传递给对象的选项类型的正确方法是什么?例如:

/**
 * test() function can receive all type of options.
 * @param {Object.<string, *>} options
 * @expose
 */
function test(options) {
    if(typeof options.set !== "undefined") {
        alert(options.set);
    }

    if(typeof options.callback !== "undefined") {
        options.callback.apply(this, []);
    }
}

我如何定义类似的东西......?

/**
 * @param {Object.<string, *>} options
 *     @param {Object.<string, *>} options.set
 *     @param {function(... [*])}  options.callback
 */

如果我什么都不做,编译器会返回如下错误:

script.js:28: WARNING - Property callback never defined on Object.<string, *>
                  options.callback.apply(this, []);
                  ^

使用方法:

java -jar "compiler.jar" 
    --compilation_level ADVANCED_OPTIMIZATIONS 
    --warning_level VERBOSE 
    --js "script.js" 
    --js_output_file "script.min.js"

3 个答案:

答案 0 :(得分:3)

您可以使用record type

@param {{set: Object, callback: function}} options

答案 1 :(得分:2)

如果您想准确指定每个选项,可以这样做:

/**
 * @param {{row: number, field: string, callback: function(string) }} options
 */

所以你可以声明对象结构,包括类型,细节是here

答案 2 :(得分:-1)

只需要创建一个新变量并将其设置为@constructor@expose所有这些方法,例如:

/**
 * @constructor
 */
var TestOptions = function() {
    /**
     * @type {Object.<string, *>}
     * @expose
     */
    this.set;

    /**
     * @type {function(... [*])}
     * @expose
     */
    this.callback;
};

我只需要将其设置为@param类型,例如:

/**
 * test() function can receive all type of options.
 * @param {TestOptions} options
 * @expose
 */
function test(options) {
    /* ... */
}

TestOptions不会在script.min.js上,因为我从未在其上使用new