Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/447.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 闭包编译器类型:参考函数(工厂方法)_Javascript_Google Closure Compiler - Fatal编程技术网

Javascript 闭包编译器类型:参考函数(工厂方法)

Javascript 闭包编译器类型:参考函数(工厂方法),javascript,google-closure-compiler,Javascript,Google Closure Compiler,假设我有一个带有工厂方法的类: export class Foo { constructor(options) { this.a = options.a; this.b = options.b; } /** * @param {{ * a: number, * b: number * }} options * @return {!Foo} */ static cr

假设我有一个带有工厂方法的类:

export class Foo {
    constructor(options) {
        this.a = options.a;
        this.b = options.b;
    }

    /**
     * @param {{
     *   a: number,
     *   b: number
     * }} options
     * @return {!Foo}
     */
    static create(options) {
        return new Foo(options);
    }
}
我想在另一个类中插入
Foo
的工厂方法,如:

/**
 * @param {{
 *   createFoo: !function(!Object): !Foo
 * }} options
 */
问题:闭包编译器说这与形式参数不匹配

found   : {
  createFoo: function ({a: number, b: number): Foo, 
}

required: {
  createFoo: function (Object): Foo, 
}
显然,我可以重写记录中的类型签名和硬代码,但我真的想引用
Foo.create
,这样就不必每次向options对象添加新参数时都更新整个代码库


如何为CC执行此操作?

一种方法是在typedef中写入一次类型,然后在两个位置引用它。(我还没试过,但我觉得应该可以用)


一般的问题是,您需要一个比Foo.create方法更易于接受的函数。Nick Santos对此做了很好的解释:

使用松散的函数类型“function”或“!function”将如您所希望的那样工作

我使用此定义来验证:

/** @param {{createFoo: !Function}} options */
function f(options) {}

f({createFoo: Foo.create});

/** @param {{createFoo: !Function}} options */
function f(options) {}

f({createFoo: Foo.create});