2016-04-03 13 views
2

クラスのTypescriptでデコレータや注釈を使用する理由がわかりません。コンパイラは新しいタイプのクラスを推論することはできません。私がデコレータを使用せずにES5でこれを行うために古い方法(つまり、デコレータを手動で呼び出す)を使用すると、明らかに機能します。例えばTypescript:デコレータ使用時の型推論

は、ここでの問題を示すサンプル:

function decorate(Target: typeof Base): IExtendedBaseConstructor { 
    return class extends Target implements IExtendedBase { 
    public extendedtMethod(): number { 
     return 3; 
    } 
    }; 
} 

interface IBase { 
    baseMethod(): number; 
} 

interface IExtendedBase extends Base { 
    extendedtMethod(): number; 
} 

interface IExtendedBaseConstructor { 
    new(): IExtendedBase; 
} 

@decorate 
class Base implements IBase { 
    public baseMethod(): number { 
    return 5; 
    } 
} 

const test = new Base(); 
test.baseMethod(); // OK 
test.extendedtMethod(); // NOT OK, typescript think, Base is still Base but we decorated it. 

古い方法では、それが動作します:事前に

class Base implements IBase { 
    public baseMethod(): number { 
    return 5; 
    } 
} 

const ExtendedBase = decorate(Base); 

const test = new ExtendedBase(); 
test.baseMethod(); // OK 
test.extendedtMethod(); // OK 

感謝を。

+0

このパターンの利点は何ですか? [this code](https://jsfiddle.net/pcyybdt7/1/)は理解しにくいですか? –

+0

あなたは正しいです。この場合、このパターンは役に立たない。しかし、新しいフロントエンドフレームワーク(angular2のような)は、継承の代わりにデコレータを使用して新しいコンポーネントを宣言しました。 – Cnode

+0

私は、クラスAPIを作成するためのヘルパーをユーザに提案するライブラリを作成しました(いくつかのパラメータと便利なメソッドが組み込まれています)。だから私は機能を提供する抽象Apiクラスと、メタデータを介してAPIを自分のフレームワークに登録するデコレータを作成しました。 私のユーザーがしなければならない。この場合: 'インポート{AbstractAPI、アピ} 'MYLIB' @Api(...)から クラスUserApiはAbstractAPI {}' 私のSOの質問はまた、これに関連しているが拡張されています。私が拡張子を削除してすべてをデコレータ '@ Api 'にマージすると、最終的なユーザの入力ミスを減らすことができます。 – Cnode

答えて

2

今のところこれは機能しません。クラスデコレータがクラスのタイプを変更できるようにするには、githubにpending issueがあります。

これが実装されるまで、あなたが言いました「古い方法」を実行することをお勧めします。