しかし、私は、詳細なメタデータを提供することを除いて、Component decoratorが本当に何をしているのかを深く理解したいと思います。
もっと何かが必要なのはなぜですか? @Component
デコレータ関数に渡される引数は、メタデータです。それがメタデータを提供する主な責任です。
あなたは似たものを再現したい場合は、最も簡単な方法は、
reflect-metadata
をインストールすることです。
npm install --save reflect-metadata
デコレータ関数を作成します
import 'reflect-metadata';
interface MyComponentMetadata {
template?: string;
selector?: string;
}
function MyComponent(metadata: MyComponentMetadata) {
return function(ctor: Function) {
// add metadata to constructor
Reflect.defineMetadata('annotations', metadata, ctor);
}
}
あなたがメタデータを取得する必要があるときだけ
を行い、今 @MyComponent({
selector: 'component',
template: '<hello></hello>'
})
class HelloComponent {
}
それを使用します
let metadata = Reflect.getMetadata('annotations', HelloComponent);
メタデータの目的は、Angularがそのクラスで何をするべきかを知るための情報を提供することです。したがって、デコレータはメタデータプロバイダだけではありません。 Angularは、デコレータ機能ではなく、メタデータの処理方法を決定します。
- FYI TypeScript documentation on decorators
を参照してください:1.2 @私の '@角度/ cli'で。1プロジェクト私は、main.tsファイルの先頭に 'reflect-metadata'をインポートして、' defineMetadata'と 'getMetadata'関数をコンパイラに知らせなければなりませんでした。私のデコレータのソースファイルでインポートを行うと、コンパイラは '@ NgModule'デコレータが不足していると不満を持ちました。 – TekTimmy