Polyfill for Metadata Reflection API
Proposal to add Decorators to ES7, along with a prototype for an ES7 Reflection API for Decorator Metadata
npm install reflect-metadataclass C { @Reflect.metadata(metadataKey, metadataValue) method() { }}Reflect.defineMetadata(metadataKey, metadataValue, C.prototype, "method");let obj = new C();let metadataValue = Reflect.getMetadata(metadataKey, obj, "method");// define metadata on an object or propertyReflect.defineMetadata(metadataKey, metadataValue, target);Reflect.defineMetadata(metadataKey, metadataValue, target, propertyKey); // check for presence of a metadata key on the prototype chain of an object or propertylet result = Reflect.hasMetadata(metadataKey, target);let result = Reflect.hasMetadata(metadataKey, target, propertyKey); // check for presence of an own metadata key of an object or propertylet result = Reflect.hasOwnMetadata(metadataKey, target);let result = Reflect.hasOwnMetadata(metadataKey, target, propertyKey); // get metadata value of a metadata key on the prototype chain of an object or propertylet result = Reflect.getMetadata(metadataKey, target);let result = Reflect.getMetadata(metadataKey, target, propertyKey); // get metadata value of an own metadata key of an object or propertylet result = Reflect.getOwnMetadata(metadataKey, target);let result = Reflect.getOwnMetadata(metadataKey, target, propertyKey); // get all metadata keys on the prototype chain of an object or propertylet result = Reflect.getMetadataKeys(target);let result = Reflect.getMetadataKeys(target, propertyKey); // get all own metadata keys of an object or propertylet result = Reflect.getOwnMetadataKeys(target);let result = Reflect.getOwnMetadataKeys(target, propertyKey); // delete metadata from an object or propertylet result = Reflect.deleteMetadata(metadataKey, target);let result = Reflect.deleteMetadata(metadataKey, target, propertyKey); // apply metadata via a decorator to a constructor@Reflect.metadata(metadataKey, metadataValue)class C { // apply metadata via a decorator to a method (property) @Reflect.metadata(metadataKey, metadataValue) method() { }}function ParamTypes(...types) { return (target, propertyKey) => { const symParamTypes = Symbol.for("design:paramtypes"); if (propertyKey === undefined) { target[symParamTypes] = types; } else { const symProperties = Symbol.for("design:properties"); let properties, property; if (Object.prototype.hasOwnProperty.call(target, symProperties)) { properties = target[symProperties]; } else { properties = target[symProperties] = {}; } if (Object.prototype.hasOwnProperty.call(properties, propertyKey)) { property = properties[propertyKey]; } else { property = properties[propertyKey] = {}; } property[symParamTypes] = types; } };}function ParamTypes(...types) { // as propertyKey is effectively optional, its easier to use here return (target, propertyKey) => { Reflect.defineMetadata("design:paramtypes", types, target, propertyKey); } // vs. having multiple overloads with the target and key in the front: // // return (target, propertyKey) => { // if (propertyKey === undefined) { // Reflect.defineMetadata(target, "design:paramtypes", types); // } // else { // Reflect.defineMetadata(target, propertyKey, "design:paramtypes", types); // } // } // // vs. having a different methods for the class or a property: // // return (target, propertyKey) => { // if (propertyKey === undefined) { // Reflect.defineMetadata(target, "design:paramtypes", types); // } // else { // Reflect.definePropertyMetadata(target, propertyKey, "design:paramtypes", types); // } // }}"experimentalDecorators": true to your tsconfig.json file."emitDecoratorMetadata": true to your tsconfig.json file.