2016-03-31 16 views
4

Bir fabrika yöntemi ile bir sınıf olduğunu varsayalım:Kapatma derleyici yazarak: işlevine bakın (fabrika yöntemi)

: Ben gibi başka bir sınıfta Foo 'ın fabrika yöntemini enjekte bağımlılık istiyoruz

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

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

Sorun: Closure Compiler, bunun resmi parametreyle eşleşmediğini söylüyor.

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

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

Açıkçası ben kayıtlarında tipi imzasını ve sert kodunu yeniden yazabilirsiniz, ama gerçekten bu kadar bütün kod tabanına seçenekleri nesne yeni bir param eklemek her zaman güncellemek için gerek yoktur Foo.create başvurmak istiyorum.

Bunu CC için nasıl yapabilirim?

cevap

2

genel sorun daha Foo.create yöntemine göre daha kabul olduğu bir işlev gerektiren olmasıdır (bu denemedim ama işe gerektiğini düşünüyorum). Nick Santos bunun iyi bir açıklama yazdı: umut gibi

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

gevşek bir işlev türü "Fonksiyon" veya "! İşlevi" kullanma çalışacaktır.

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

f({createFoo: Foo.create}); 

CC debugger sample

3

Yazmanın bir yolunu yazarak bir kez yazmak ve sonra da her iki yerde de buna bakmaktır.

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

ya '@ record' kullanımı:

I doğrulamak için bu tanım kullanılan –

İlgili konular