reflect-metadata
런타임에 클래스, 함수에 데이터를 조작할 수 있다.
설정
tsconfig.json에 emitDecoratorMetadata 설정 필요
emitDecoratorMetadata: true
npm i --save reflect-metadata
사용법
const aaaa = {
bbbb: 'ccc'
};
// metadataKey로 데이터 설정 및 조회
Reflect.defineMetadata('test', 'test2', aaaa);
const test = Reflect.getMetadata('test', aaaa);
console.log(`aaaa: ${JSON.stringify(aaaa)}`);
console.log(`test = ${test}`);
Reflect.defineMetadata('test2', 'test3', aaaa, 'bbbb');
const test2 = Reflect.getMetadata('test2', aaaa, 'bbbb');
console.log(`test2 = ${test2}`);
/*
aaaa: {"bbbb":"ccc"}
test = test2
test2 = test3
*/
데코레이터와 같이 사용하기
class ReflectClass {
data: string = 'reflect data';
@reflectDecorator
testFun(): void {
console.log('aaaaaaaa');
}
}
function reflectDecorator(target: any, propertyKey: string, descriptor: PropertyDescriptor) {
console.log(`target = ${JSON.stringify(target)}`);
console.log(`propertyKey = ${propertyKey}`);
console.log(`descriptor = ${JSON.stringify(descriptor)}`);
Reflect.defineMetadata('key', 1234, target, propertyKey);
}
const metadata = Reflect.getMetadata('secret', ReflectClass.prototype, 'testFun');
console.log(`metadata = ${Reflect.getMetadata('key', ReflectClass.prototype, 'testFun')}`); //1234
console.log(`ReflectClass = ${JSON.stringify(ReflectClass)}`);
/*
target = {}
propertyKey = testFun
descriptor = {"writable":true,"enumerable":false,"configurable":true}
metadata = 1234
ReflectClass = undefined
*/
참고사이트
'정리 > TypeScript' 카테고리의 다른 글
Type에서 데코레이터 사용하기 (0) | 2022.11.05 |
---|---|
TypeORM에서 메모리DB(pg-mem) 사용해서 테스트 코드 만들기 (0) | 2022.11.04 |
댓글