クラス・メソッド・プロパティにメタデータや動作を付与する
// ── デコレーター: クラスやメソッドに機能を追加する仕組み ─
// tsconfig.json で "experimentalDecorators": true が必要
// ── メソッドデコレーター: 実行時間を計測する ─────────
function measure(target: any, key: string, descriptor: PropertyDescriptor) {
const original = descriptor.value;
descriptor.value = function (...args: any[]) {
const start = Date.now();
const result = original.apply(this, args);
console.log(key + ' の実行時間: ' + (Date.now() - start) + 'ms');
return result;
};
return descriptor;
}
class DataService {
@measure // ← デコレーター適用(メソッドの上に書く)
fetchAll() {
// 重い処理...
return data;
}
}
// ── クラスデコレーター ────────────────────────────────
function singleton<T extends new (...args: any[]) => {}>(constructor: T) {
// クラスのインスタンスを1つだけに制限する
let instance: InstanceType<T>;
return class extends constructor {
constructor(...args: any[]) {
if (instance) return instance;
super(...args);
instance = this as InstanceType<T>;
}
};
Angular/NestJSで多用される。TC39のステージ3デコレータ提案(新仕様)とexperimentalDecoratorsで挙動が異なる場合があるため注意。