如何实现以下原型代码:
class test {
a: number;
b: boolean;
c: string;
}
for (const so in test)
so, //'a', 'b', 'c'...
//so.type //'number', 'boolean', 'string'...
我不知道如何获取类型,但是我尝试创建一个新对象并对其进行迭代以获取名称,但是显然这没有用,因为类成员未初始化。
答案 0 :(得分:1)
正如关于该问题的评论中所建议的那样,元数据可以在某种程度上被使用,但是它很杂乱。
首先,装饰器必须将所有键名称存储在列表中,因为属性实际上并不存在于原型中:
import 'reflect-metadata';
const propertiesSymbol = Symbol('properties');
const metadata = (target: any, key: string) => {
let list = <string[] | undefined>target[propertiesSymbol];
if (list == undefined)
list = target[propertiesSymbol] = [];
list.push(key);
};
这用于类的属性:
class Test {
@metadata
a!: number;
@metadata
b!: boolean;
@metadata
c!: string;
}
要迭代,可以从符号属性符号槽中检索列表,并且可以使用getMetadata
函数来获取生成的design:type
。这将是类型构造函数,而不是名称。
for (const key of (Test.prototype as any)[propertiesSymbol])
console.log(Reflect.getMetadata("design:type", Test.prototype, key));
这应该打印如下内容:
[Function: Number]
[Function: Boolean]
[Function: String]
请注意,编译器设置必须包含装饰器和元数据标志:
"compilerOptions": {
// ...
"experimentalDecorators": true,
"emitDecoratorMetadata": true
}