typecriptでは、プロパティデコレータを使用してクラスのメタデータを設定できますか?以下のコードを考えてみましょう。クラスデコレータの「ターゲット」は、明らかにプロパティデコレータの「ターゲット」と同じではありません。他のものから1つを派生させることはできますか?プロパティデコレータは、そのクラスのメタデータをtypescriptできますか?
import 'reflect-metadata';
const MY_CLASS_DECORATOR_KEY = 'MyClassDecoratorKey';
const MY_PROPERTY_DECORATOR_KEY = 'MyPropertyDecoratorKey';
export const MyClassDecorator = options => {
return function (target) {
console.log('class target: ' , target);
Reflect.defineMetadata(MY_CLASS_DECORATOR_KEY, options, target);
};
};
export const MyPropertyDecorator = (options): PropertyDecorator => {
return (target, property) => {
console.log('property target: ' , target);
const metadata = Reflect.getMetadata(MY_PROPERTY_DECORATOR_KEY, target) || {};
metadata[property] = options;
Reflect.defineMetadata(MY_PROPERTY_DECORATOR_KEY, metadata, target);
};
};
@MyClassDecorator('my class decorator value')
class MyClass {
@MyPropertyDecorator('first my property decorator value')
myFirstProperty: any;
@MyPropertyDecorator('second my property decorator value')
mySecondProperty: any;
}
console.log('keys: ', Reflect.getMetadataKeys(MyClass));
注出力:
property target: MyClass {}
property target: MyClass {}
class target: function MyClass() {
}
keys: [ 'MyClassDecoratorKey' ]
はどのようにしても、プロパティデコレータから鍵を表示するには、メタデータのキーを取得することができますか?
素晴らしいです。あなたの答えはまさに私が必要としていたものです。本当にありがとう!しかし、私は他の方向に進み、メタデータをコンストラクタではなくプロトタイプに配置したいとします。私は他の方向に行くことができますか? – bkinsey808
もちろん、target.prototypeを実行してください – dtabuenc