Как предлагается в комментарии к вопросу, метаданные могут использоваться в некоторой степени, но это грязно.
Сначала декоратор должен сохранить все имена ключей в списке, потому что свойства на самом деле не существуют впрототип:
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
}