TypeScript
クラスデコレータ
サーチ…
パラメーター
パラメータ | 詳細 |
---|---|
ターゲット | 装飾されているクラス |
基本クラスのデコレータ
クラスデコレータは、クラスを唯一の引数として受け取り、それを使ってクラスを返します。
function log<T>(target: T) {
// Do something with target
console.log(target);
// Return target
return target;
}
クラスデコレータをクラスに適用することができます:
@log
class Person {
private _name: string;
public constructor(name: string) {
this._name = name;
}
public greet() {
return this._name;
}
}
クラスデコレータを使用したメタデータの生成
今回は、クラスにデコレータを宣言して、クラスにメタデータを追加します。
function addMetadata(target: any) {
// Add some metadata
target.__customMetadata = {
someKey: "someValue"
};
// Return target
return target;
}
次に、クラスデコレータを適用します。
@addMetadata
class Person {
private _name: string;
public constructor(name: string) {
this._name = name;
}
public greet() {
return this._name;
}
}
function getMetadataFromClass(target: any) {
return target.__customMetadata;
}
console.log(getMetadataFromClass(Person));
デコレータは、クラスのインスタンスを作成しないときにクラスが宣言されたときに適用されます。つまり、メタデータはクラスのすべてのインスタンスで共有されます。
function getMetadataFromInstance(target: any) {
return target.constructor.__customMetadata;
}
let person1 = new Person("John");
let person2 = new Person("Lisa");
console.log(getMetadataFromInstance(person1));
console.log(getMetadataFromInstance(person2));
引数をクラスデコレータに渡す
カスタマイズを可能にするクラスデコレータを別の関数でラップすることができます:
function addMetadata(metadata: any) {
return function log(target: any) {
// Add metadata
target.__customMetadata = metadata;
// Return target
return target;
}
}
addMetadata
は設定として使用されたいくつかの引数をとり、実際のデコレータである名前のない関数を返します。デコレータでは、クロージャが適切に配置されているため、引数にアクセスできます。
次に、いくつかの設定値を渡すデコレータを呼び出すことができます:
@addMetadata({ guid: "417c6ec7-ec05-4954-a3c6-73a0d7f9f5bf" })
class Person {
private _name: string;
public constructor(name: string) {
this._name = name;
}
public greet() {
return this._name;
}
}
生成されたメタデータにアクセスするには、次の関数を使用できます。
function getMetadataFromClass(target: any) {
return target.__customMetadata;
}
console.log(getMetadataFromInstance(Person));
すべてがうまくいったら、コンソールに次のように表示されます:
{ guid: "417c6ec7-ec05-4954-a3c6-73a0d7f9f5bf" }
Modified text is an extract of the original Stack Overflow Documentation
ライセンスを受けた CC BY-SA 3.0
所属していない Stack Overflow