2016-03-31 12 views
4

私はファクトリメソッドを持つクラスがあるとします。閉鎖コンパイラタイピング:機能(ファクトリメソッド)を参照してください

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 
*/ 

問題:Closure Compilerは、これが仮パラメータと一致しないと言っています。

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

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

ので、全体のコードベース私はオプションのオブジェクトに新しいのparamを追加するたびに更新する必要はありませんもちろん、私はレコードに型シグネチャとハードコードを書き換えることができますが、私は本当にFoo.createを参照したいです。

どのようにCCでこれを行うことができますか?

答えて

2

(私はこれを試していないが、私はそれが動作するはずだと思う)一般的な問題は、あなたがよりFoo.create方法よりも受け入れている機能を必要としていることです。ニック・サントスは、この良い説明を書きました:あなたが望んでいるだろうと

http://closuretools.blogspot.com/2012/06/subtyping-functions-without-poking-your.html

緩い機能タイプ「機能」や「!機能」を使用して動作します。

私が確認するために、この定義を使用:

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

f({createFoo: Foo.create}); 

CC debugger sample

3

1つの方法は、型を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 
*/ 
+0

や '@のrecord'を使用 –

関連する問題