Как перебрать несуществующий член класса? - PullRequest
0 голосов
/ 27 февраля 2019

Как мне получить следующий код-прототип:

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

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

Я понятия не имею, как получить тип, однако я попытался создать новый объект и повторить его для имен, но, очевидно,это не сработало, так как ученики остались не инициализированными.

1 Ответ

0 голосов
/ 27 февраля 2019

Как предлагается в комментарии к вопросу, метаданные могут использоваться в некоторой степени, но это грязно.

Сначала декоратор должен сохранить все имена ключей в списке, потому что свойства на самом деле не существуют впрототип:

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
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...