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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何迭代不存在的类成员?相关的知识,希望对你有一定的参考价值。

我如何实现以下原型代码:

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);
};

这用于类的属性:

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
}

以上是关于如何迭代不存在的类成员?的主要内容,如果未能解决你的问题,请参考以下文章

PyCharm 为类中不存在的成员发送警告

如何将 View 类中的代码片段移动到 OnAppearing() 方法?

如何检测类中是不是存在特定的成员变量?

GeekBand-secondweek-c++的组合和继承

c++ 中的每个对象是不是包含不同版本的类成员函数?

包+static成员+代码块+内部类