2016-09-07 45 views
2

我不明白如何在打字機裝飾器@Injectable捕獲類型信息以及它如何知道構造函數參數列表中沒有提供明確的@Inject(...)時哪種類型的構造函數參數對應哪種類型?如何複製這樣的行爲,並以簡單的方式爲我自己的庫創建自己的注入器。打字員裝飾者如何允許角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); 

希望這有助於!