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

标签 angular typescript typescript-decorator

我想为已经用 Angular Input 装饰器装饰的属性添加装饰器。
我需要这个,因为我想为特定的 Component 获取一些(装饰的)Input 属性。

我发现了非常相似的问题 here ,但有一个很大的不同(我需要它用于属性而不是类,所以我不能按照建议的公认答案在类上引入新变量)。

我想实现的是:

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对于上面的代码。仍然可以找到旧的 Plunker here .

关于angular - 如何找到装饰有某种装饰的所有属性?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49031586/

相关文章:

angular - MatSort 未定义 - Angular 5

typescript - Typescript是否允许将 “any”分配给其他所有类型?如何处理渔获(错误: any)?

typescript - 我应该在构造函数中抛出异常吗

调试器忽略了 TypeScript toString

typescript - 对于 typescript ,当前未启用 'decorators-legacy' 的错误,事件我设置了 ExperimentalDecorators 和 emitDecoratorMetadata 为真

javascript - ngx-datatable 可配置分页参数

javascript - 延迟加载模块和预加载模块策略哪一种更好?

TypeScript 方法装饰器——启用 noImplicitThis 的 `this`

Angular2 Material sidenav - 动态改变rtl/ltr方向

typescript - 从方法装饰器获取方法签名