如何找到装饰有某种装饰的所有属性?
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。
我想将装饰器添加到 属性 已经用 Angular Input
装饰器装饰。
我需要这个,因为我想为特定 Component
.
Input
属性
我发现了非常相似的问题
我要实现的是:
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。