2016-09-07 5 views
2

typescriptデコレータ@Injectableは型情報をどのようにキャプチャし、後でコンストラクタパラメータリスト内で明示的に@Inject(...)が指定されていないときにどの型に対応するコンストラクタパラメータを知るのかを理解できませんか?このような振る舞いを簡単に再現する方法は、自分のライブラリのための私のインジェクタを作成することです。typescriptデコレータは角度2でタイプメタデータを検出することができます

@Injectable() 
export class AppService { 
} 

export class AppComponent { 
    public constructor(private appService: AppService) { 

    } 
} 

答えて

2

あなたは、たとえば、デコレータがどのように機能するかにコンパイルされたコード内の洞察力を見ることが

コンパイルされたコードは、この中

ComponentClass = __decorate([ 
     core_1.Component({ 
      moduleId: module.id, 
      selector: 'component-selector', 
      templateUrl: 'component.html', 
      styleUrls: ['component.css'], 
      providers: [component_service_1.ComponentService] 
     }), 
     __metadata('design:paramtypes', [component_service_1.ComponentService]) 
    ], ComponentClass); 

角度コアが見えるそれがReflect.jsを使用して、以下のようになりますコンポーネントに関するメタデータ情報を取得します。

MyCustomDecorator

それを使用する方法
import "reflect-metadata"; 

interface ICustomDecoratorMeta{ 
    var1: string 
} 

export var MyCustomDecorator = 
    (metadata: <ICustomDecoratorMeta>) => { 
     return (target) => { 
      Reflect.defineMetadata("MyCustomDecorator", metadata, target); 
     } 
    } 

、このことができます

@MyCustomDecorator({ 
    var1 : "Hello" 
}) 
export class MyClass(){} 


// To retrieve metadata you can use below, 

var metadata = Reflect.getMetadata('MyCustomDecorator', MyClass); 

希望、あなたは以下試すことができ、独自のデコレータを作成するには!