【超便利】TypeScriptでメタデータ操作!reflect-metadataの使い方とサンプルコード
TypeScriptにおける「reflect-metadata」とは?
reflect-metadata の主な機能は次のとおりです。
- メタデータに基づいたコードの検査と変換
- ランタイムでのメタデータの動的な追加と削除
- デコレータで定義されたメタデータへのアクセスと操作
reflect-metadata の具体的な使用例としては、次のものがあります。
- テストフレームワークの拡張
- コード生成ツールの作成
- ロギングや監査機能の追加
- 依存関係注入 (DI) フレームワークの実装
reflect-metadata を使用するには、まずライブラリをインストールする必要があります。
npm install reflect-metadata
次に、デコレータでメタデータを定義できます。
import { Reflect } from 'reflect-metadata';
@Decorator(
(target: any, propertyKey: string, descriptor: PropertyDescriptor) => {
Reflect.defineMetadata('my-metadata', 'value', target, propertyKey);
}
)
class MyClass {
@myDecorator
public myProperty: string;
}
この例では、myDecorator
デコレータは my-metadata
というメタデータを MyClass
クラスの myProperty
プロパティに定義します。
reflect-metadata を使用して、定義されたメタデータにアクセスできます。
import { Reflect } from 'reflect-metadata';
const metadata = Reflect.getMetadata('my-metadata', MyClass.prototype, 'myProperty');
console.log(metadata); // 'value' を出力
この例では、Reflect.getMetadata
メソッドを使用して、MyClass
クラスの myProperty
プロパティに定義された my-metadata
メタデータを取得します。
reflect-metadata は、TypeScript でメタデータを使用するための強力なツールです。デコレータと組み合わせて使用することで、コードをより柔軟で拡張性の高いものにすることができます。
reflect-metadata
は、Node.js およびブラウザの両方で動作します。reflect-metadata
は、コア TypeScript ライブラリの一部ではありません。
import { Reflect } from 'reflect-metadata';
export function Logger(target: any, propertyKey: string, descriptor: PropertyDescriptor) {
const originalMethod = descriptor.value;
descriptor.value = function (...args: any[]) {
console.log(`Calling ${propertyKey} with arguments: ${args}`);
const result = originalMethod.apply(this, args);
console.log(`Returning from ${propertyKey} with result: ${result}`);
return result;
};
}
このコードでは、Logger
というデコレータを定義しています。このデコレータは、デコレータが適用されたメソッドが呼び出されるたびに、コンソールにログを出力します。
デコレータの使用
import { Logger } from './logger-decorator';
class Calculator {
@Logger
add(a: number, b: number): number {
return a + b;
}
}
const calculator = new Calculator();
const sum = calculator.add(1, 2);
console.log(`Sum: ${sum}`);
このコードでは、Logger
デコレータを Calculator
クラスの add
メソッドに適用しています。これにより、add
メソッドが呼び出されるたびに、コンソールにログが出力されます。
出力例
Calling add with arguments: [1, 2]
Returning from add with result: 3
Sum: 3
メタデータへのアクセス
import { Reflect } from 'reflect-metadata';
class User {
@Logger
name: string;
constructor(name: string) {
this.name = name;
}
}
const user = new User('John Doe');
const metadata = Reflect.getMetadata('design:type', user, 'name');
console.log(metadata); // 'String' を出力
reflect-metadata 以外の方法
TypeScript のコア機能
TypeScript 自体には、いくつかのコア機能が用意されており、メタデータを使用できます。
- ジェネリック型パラメータ
ジェネリック型の制約にメタデータを定義するために使用できます。 const enum
宣言: 列挙型の値にメタデータを定義するために使用できます。declare global
キーワード: グローバル変数にメタデータを定義するために使用できます。
これらの機能は、限られた用途には役立ちますが、reflect-metadata ほど柔軟ではありません。
カスタムデコレータ
独自のデコレータを作成して、メタデータを定義および操作できます。これは、特定のニーズに合わせたメタデータスキーマを作成する必要がある場合に役立ちます。
サードパーティライブラリ
reflect-metadata 以外にも、TypeScript でメタデータを使用するためのサードパーティライブラリがいくつかあります。これらのライブラリは、reflect-metadata よりも多くの機能を提供したり、特定のユースケースに特化したものがあります。
どの方法を選択するかは、ニーズと要件によって異なります。
reflect-metadata は、シンプルで使いやすい汎用的なソリューションです。
TypeScript のコア機能 は、軽量で柔軟なソリューションが必要な場合に適しています。
typescript reflect-metadata