2017-04-17 6 views
0

クラスデコレータのデコレータシグネチャを、すでに存在するjavascriptコードのtypescriptで定義したいとします。のは、私がFoo必要なメソッドを含むクラスデコレータシグネチャ

class Foo { 
    someMethod() { 
    } 
} 

が続いても、入力クラスを取り、いくつかのクラスのデコレータ方法があるが、それは入力クラスは、それが飾られる前に定義されているいくつかの他の方法を持っている必要がありますいくつか、すでに定義されたクラスがあるとしましょう。その後、

interface WithRequiredMethod { 
    requiredMethod(): any; 
} 

declare function decorate<C extends Foo>(input: C & WithRequiredMethod): C; 

としてそれを呼び出す:

function decorate(someClass) { 
    // some properties and methods injection happens here 
} 

その後、私のtypescriptですコードで、私のように飾るためにクラスを作成します。私が試した定義については、次に

class Bar extends Foo { 
    requiredMethod(): any { 
    return null; 
    } 
} 

const DocoratedBar = decorate(Bar); 

残念ながら、typescript doesn ' requiredMethodが定義されていてもBarを有効な入力として認識しません。入力クラスにrequiredMethodの存在を確認するために、decorate署名を定義する方法はありますか?

答えて

0

あなたはほとんどそれを持っています。しかし、これを書く必要があります

interface WithRequiredMethod { 
    // tslint:disable-next-line:no-any 
    requiredMethod(): any; 
} 

declare function decorate<C extends new() => Foo & WithRequiredMethod>(target: C): C; 

なぜなら、デコレータはクラスをターゲットにしているからです。クラスは実際には単なるコンストラクタ関数です。したがって、装飾されるオブジェクトは実際にはFoo & WithRequiredMethodのオブジェクトのコンストラクタ関数です。我々は唯一のFooまたはそのサブクラスの1つをターゲットに私たちのデコレータを制限したい場合

例えば、我々は

declare function decorate<T extends typeof Foo>(target: T): T; 

興味深いことに書くと、最初に受信エラーがclass Barがある、WithRequiredMethodを実装していないと述べています確かに真実ですが、私たちが言いたいことはありません。しかし、それはいつか言い表すのが有益でしょう、そして、いつ私たちはデコレータを利用して静的プロパティとインスタンスプロパティの両方を強制することができます。

は考えてみましょう:

declare function decorate< 
    C extends WithRequiredMethod & (new() => Foo & WithRequiredMethod) 
>(target: C): C; 

は、今、私たちはclass Barにこれを適用し、再びrequiredMethodが欠落していることをエラーメッセージが表示されます。私たちは、しかし、Barに静的requiredMethodメソッドを追加することにより、要件を満たすことができます。

@decorate class Bar extends Foo { 
    // required by `decorate` 
    static requiredMethod() { 
    // tslint:disable-next-line:no-null-keyword 
    return null; 
    } 

    // also required by `decorate` 
    requiredMethod() { 
    // tslint:disable-next-line:no-null-keyword 
    return null; 
    } 
} 
+0

おかげで、それは私が見落としものです。 –

関連する問題