2016-09-05 3 views
0

フィールドのデコレータで反射を使用する際に問題がありました。私は署名の下にデコレータを作成しました:Reflectを使用したときのインターフェイス名の代わりの機能

export function Inject() { 
    return function (clazz, name) { 
     ....... 
     let typeName: string = Reflect.getOwnMetadata("design:type", clazz, name).name; 
     ......... 
    } 
} 

class MyClass{ 
    @Inject() 
    private $q:ng.IQService 
} 

そして私はフィールドに@Injectを使用します。フィールドタイプがクラスのときに機能しますが、フィールドタイプがインターフェイスの場合は、インターフェイスの名前ではなくFunctionを返します。どうすれば修正できますか?

+0

インタフェースは実行時に存在しません。そのデコレータをクラスとインターフェイスの両方で使用する場所で、コードの一部を追加できますか? –

+0

@NitzanTomer私はそれを – Pooya

答えて

1

私がコメントに書いたように、インタフェースはコンパイルされたjの一部ではなく、単に出力から出力するコンパイラによって使用されます。
デコレータは実行時に実行されているため、デコレートするインタフェースに関する情報はありません。

class MyClass { 
    @MyDeco 
    myMember: MyType; 
} 

行うのと同等です:

class MyClass { 
    @MyDeco 
    @Reflect.metadata("design:type", MyType) 
    myMember: MyType; 
} 

あなたが@Reflect.metadata一部を自分が含まれていない場合ので、どちらが、彼らはこれを行うことはことを示してDecorators docs (Metadata section)で最後の例では

コンパイラがそれを追加します。

しかしMyTypeインターフェイスがあるときにコンパイラがObjectでそれを代用しますので、この:

interface MyInterfaceType {} 

class MyClassType {} 

class MyClass { 
    @MyDeco 
    member1: MyClassType; 

    @MyDeco 
    member2: MyInterfaceType; 
} 

をするようにコンパイルされている:

var MyClass = (function() { 
    function MyClass() { 
    } 
    __decorate([ 
     MyDeco, 
     __metadata('design:type', MyClassType) 
    ], MyClass.prototype, "member1", void 0); 
    __decorate([ 
     MyDeco, 
     __metadata('design:type', Object) 
    ], MyClass.prototype, "member2", void 0); 
    return MyClass; 
}()); 

はあなたがインターフェイスを使用し続けるとしたい場合は、その名前を受け取るデコレータのオプションのパラメータを持つことをお勧めします。次に、このデコレータをインターフェイスに使用するときに名前を置くだけです。
私はそれがちょっとポイントを逃していることを知っていますが、あなたは実際には(私はそれを見て)より多くのオプションを持っていない。

+0

に追加しました。これは 'Function'オブジェクトにコンパイルされていません。私はデコレータにインターフェイス名を渡す方法がないと思うし、あなたは正しいです – Pooya

+0

私はインターフェイスが関数であれば、 '関数' –

関連する問題