Č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

Súvisiace články