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});