javascript - 关闭编译器键入 : Refer to function (factory method)

标签 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 create(options) {
        return new Foo(options);
    }
}

我想在另一个类中依赖注入(inject) Foo 的工厂方法,例如:

/**
 * @param {{
 *   createFoo: !function(!Object): !Foo
 * }} options
 */

问题:Closure 编译器说这与形式参数不匹配。

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

required: {
  createFoo: function (Object): Foo, 
}

显然我可以重写记录中的类型签名和硬代码,但我真的想引用 Foo.create 所以每次添加新参数时都不需要更新整个代码库到选项对象。

我如何为 CC 执行此操作?

最佳答案

一种方法是在 typedef 中写一次类型,然后在两个地方引用它。 (我没试过这个,但我认为它应该有用)

/** @typedef {function({a: number, b:number}): Foo} */
var FooCreator;

export class Foo {
    ...

    /**
     * @type {FooCreator}
     */
    static create(options) {
        return new Foo(options);
    }
}

/**
 * @param {{
 *   createFoo: FooCreator
 * }} options
 */

关于javascript - 关闭编译器键入 : Refer to function (factory method),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36322318/

相关文章:

javascript - 使用相对和绝对位置固定滚动上重叠元素的位置

javascript - 为什么我的 $q resolve 和 promise 不像我想的那样工作?

javascript - 闭包编译器 - 无法解析 @extends 标记中的类型

javascript - 如何使用 Google Closure API 删除调试代码?

javascript - 从谷歌编译器中排除函数

JavaScript 错误仅在 Firefox jQuery.Deferred 异常 : variablename is undefined 上

javascript - Canvas 弧线倒计时,多条不同风格的弧线

javascript - DOM 和 Virtual DOM 在内存中是如何表示的?

javascript - 如何在没有构造函数的情况下在 Closure Compiler externs 中拥有类型

javascript - 使 Closure Compiler 将多个对象属性声明合并为一个大文字