通常の関数呼び出しとして注釈/デコレータを見ることができます。この関数に、 'Class/Function'オブジェクト(インスタンスではない)が第1引数で送信され、パラメータ(メタデータ)が第2引数で送信されます。
しかし、クラスのプロトタイプに何かが追加された場合(悪い練習/公開プロパティ)、その関数の実装に依存します。 TypeScriptコンパイラとAngular2は、それとは異なる方法で動作します。
これらは、TypeScriptコンパイラによって生成される__decorate
との関数を使用します。データはObject.defineProperty()機能で追加されます。これを担当するパッケージはReflectです。 (フードの下での機能をWeakMap
と組み合わせて使用します)。
機能Reflect.defineMetadata()
は、注釈を設定し、明白なReflect.getMetadata()
を得るために使用されます。
TLDR;
angular2でクラス/コンポーネントから注釈を取得するには、使用する を持っている:
Reflect.getMetadata('annotations', ComponentClass); //@Component({}), @Pipe({}), ...
angular2でコンストラクタPARAMATERSから注釈を取得するには、使用する必要があります。
Reflect.getMetadata('parameters', ComponentClass); //@Inject()
あなたが使用する必要が 、angular2でクラスのプロパティから注釈を取得するには:
Reflect.getMetadata('propMetadata', ComponentClass); //@HostBinding(), @Input(), ...
一般的な答えは、「それが依存」であるデコレータは、あなたのクラスをラップだけのものです。それは、それが選択するようにproprertyを公開することも、公開しないことも可能です。実際にアクセスできるようにする必要はありません。実際に渡されたパラメータを無視することもできます。 –