Čo je reflect-metadata v TypeScripte
Čo je reflect-metadata a aký je jeho účel?
Aká je syntax a účel používania reflect-metadata?
Môže niekto poskytnúť príklad pre lepšie pochopenie?
Ako môže reflect-metadata pomôcť pri implementácii dekorátorov v TypeScripte?
Odpoveď č. 1
reflect-metadata Umožňuje vykonávať reflexiu typov za behu.
Nativená (bez reflect-metadata) verzia inferencie typov je oveľa chudobnejšia než reflect-metadata a pozostáva iba z typeof a instanceof.
Viac
Tento blogový príspevok dobre pokrýva jeho funkcie: http://blog.wolksoftware.com/decorators-metadata-reflection-in-typescript-from-novice-to-expert-part-4
Odpoveď č. 2
Jeden spôsob použitia štandardnej funkcie Reflect s dekorátormi:
import { performance } from 'perf_hooks';
// common decorator
export function log() {
return (_target, propertyKey: string, descriptor: PropertyDescriptor) => {
const originalMethod = descriptor.value;
descriptor.value = async function (...args) {
const start = performance.now();
const result = await originalMethod.apply(this, args);
const finish = performance.now();
const ms = Math.round(finish - start);
console.log(`[${propertyKey}] ${ms}ms`);
return result;
};
return descriptor;
};
}
// Decorator to log class method or all class methods with Reflect
export function Log(): MethodDecorator & ClassDecorator {
return (target: any, key?: string, descriptor?: TypedPropertyDescriptor<any>) => {
if (descriptor) {
// method decorator
return log()(target, key, descriptor);
}
const methodNames = Reflect.ownKeys(target.prototype);
methodNames.forEach((methodName: string) => {
if (methodName !== 'constructor') {
const methodDescriptor = Reflect.getOwnPropertyDescriptor(target.prototype, methodName);
const modifiedMethodDescriptor = log()(target, methodName, methodDescriptor);
Reflect.defineProperty(target.prototype, methodName, modifiedMethodDescriptor);
}
});
// class decorator
return target;
};
}
Príklad :
@Log() // set logging for all Service class methods
class Service {
@Log() // set logging only for this method
handleTasks() {}
}
Reflektujte dokumentáciu
