Typescript 如何迭代类中不存在的成员?

Typescript 如何迭代类中不存在的成员?,typescript,reflection,Typescript,Reflection,如何实现以下原型代码: class test { a: number; b: boolean; c: string; } for (const so in test) so, //'a', 'b', 'c'... //so.type //'number', 'boolean', 'string'... 我不知道如何获取该类型,但是我尝试创建一个新对象并对其进行迭代以获取名称,但显然这不起作用,因为类成员未初始化 正如在对这个问题的评论中所建议的那样,元

如何实现以下原型代码:

class test {
    a: number;
    b: boolean;
    c: string;
}

for (const so in test)
    so, //'a', 'b', 'c'...
    //so.type //'number', 'boolean', 'string'...

我不知道如何获取该类型,但是我尝试创建一个新对象并对其进行迭代以获取名称,但显然这不起作用,因为类成员未初始化

正如在对这个问题的评论中所建议的那样,元数据在某种程度上可以被使用,但它是混乱的

首先,装饰器必须将所有键名存储在一个列表中,因为原型上实际上不存在这些属性:

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);
};
要迭代,可以从符号属性符号槽中检索列表,并且可以使用
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
}

类型信息在运行时不存在,因此您将无法获取该信息,除非您首先将其分配到某个位置,或者具有可以在上使用的值。Typescript对此不能做任何事情。@H.B.装饰器和反射元数据呢?这又是赋值了。这些在类型系统的级别上不存在。您可以使用类似的方法,但仍然需要传入值(或者在元数据的情况下,让编译器为您这样做)。
"compilerOptions": {
    // ...
    "experimentalDecorators": true,
    "emitDecoratorMetadata": true
}