【发布时间】:2022-08-18 21:47:59
【问题描述】:
首先让我说我不想要typeof 运算符。
假设我有这些课程
export function InstantiateMe(): PropertyDecorator {
return (target: object, propertyKey: string | symbol) => {
Reflect.defineMetadata(
`instantiate`,
{
propertyKey,
},
target
);
};
}
export class MySuperClass {
@InstantiateMe();
property1: MyGoodClass;
@InstantiateMe();
property2: MyBetterClass;
foo: Bar;
}
export class MyGoodClass {
Name = \'I am good\'
}
export class MyBetterClass{
Name = \'I am better\';
}
export class Bar{
Name = \'I am nothing\';
}
现在考虑我想实例化所有用@InstantiateMe DYNAMICALLY 装饰的属性的场景(即我不想做property1 = new MyGoodClass();)。
假设我以某种方式获得了MySuperClass 的实例(例如const x = new MySuperClass()),所以property1 和property2 都是undefined。我现在如何(可能使用反射)在不明确知道接受哪些类型的情况下实例化这两个属性。
请注意,我确实有 @InstantiateMe 装饰器,因此如果需要,实际上可以在那里定义/存储一些额外的信息。如果没有,请忽略它。
public instantiateAllDecoratedProperties(target: object) : void {
// Now the fun part.
}
最终对象应如下所示
{
property1 : {
Name: \'I am good\'
},
property2 : {
Name: \'I am better\'
},
foo: undefined
}
标签: typescript