如何找到装饰有某种装饰的所有属性?

How to find all properties decorated with a certain decoration?

我想将装饰器添加到 属性 已经用 Angular Input 装饰器装饰。
我需要这个,因为我想为特定 Component.

获取一些(装饰的)Input 属性

我发现了非常相似的问题 ,但有一个很大的不同(我需要它用于 属性 而不是 class,所以我不能在 [=23= 上引入新变量] 作为建议接受的答案)。

我要实现的是:

export class BaseComponent 
{   
    @Input() id: number;
    @Input() @isFilter id2: number;
    @Input() @isFilter id3: number;

    public getDefaultFilter(): object
    {
        let o: Partial<this> = {};

        //Assign all properties on this(self), which has decorator isFilter, to o!!   

        return o;    //o should be {id2: whatever_is_set, id3: whatever_is_set}
    }
}

您可以使用 reflect-metadata 将装饰属性存储为元数据。例如。下面的代码将存储所有用 @isFilter() 装饰的属性的名称。然后,您可以调用 getFilteredProperties(this) 获取仅包含装饰属性的 this 的浅表副本。

import 'reflect-metadata';

const metadataKey = Symbol('isFilter');

function isFilter(): (target: object, propertyKey: string) => void {
  return registerProperty;
}

function registerProperty(target: object, propertyKey: string): void {
  let properties: string[] = Reflect.getMetadata(metadataKey, target);

  if (properties) {
    properties.push(propertyKey);
  } else {
    properties = [propertyKey];
    Reflect.defineMetadata(metadataKey, properties, target);
  }
}

function getFilteredProperties(origin: object): object {
  const properties: string[] = Reflect.getMetadata(metadataKey, origin);
  const result = {};
  properties.forEach(key => result[key] = origin[key]);
  return result;
}

您可能还想看看 TypeScript documentation for decorators

更新:由于Plunker目前似乎有一些技术上的困难,我借此机会设置了一个Stackblitz for the code above. The old Plunker can still be found here