Typescript Reflection api
я пытаюсь задать метаданные для свойства класса
export class Info{
@Column({type: 1}) location: string;
@Column({type: 6}) description: string;
}
Декаратор
export const Column = (params: any) => {
return <T>(target: T, key: keyof T) => {
Reflect.defineMetadata(key, params, target);
}
};
получение данных
function getDecorators(target: any) {
// get info about keys that used in current property
const decorators: any[] = Reflect.getMetadataKeys(target);
console.log(decorators);
}
let info: Info= new Info();
getDecorators(info);
Но получаю только список имен свойства класса а параметры которые передал в декоратор нет.
[
'location',
'description',
]
Как их получить
Ответы (1 шт):
Автор решения: Exploding Kitten
→ Ссылка
Потому что вы в качестве ключа (metadataKey) используете название свойства. Reflect.defineMetadata(metadataKey, metadataValue, target); этот метод возвращет только ключи (в вашем случае названия свойств.
Т.е. у вас получается, что-то похожее на:
location = { type: 1 }
description = { type: 1 }
Если вы этого и хотели, то можете использовать Reflect.getMetadata(metadataKey, target); чтобы получить значение, например:
Reflect.getMetadata("location", target); // { type: 1 }
Если же вы хотите использовать type как ключ, то можно использовать что-то такое:
export const Column = (params: any) => {
return <T>(target: T, key: any) => {
for (const prop in params) {
Reflect.defineMetadata(prop, params[prop], target, key);
}
}
};
Reflect.getMetadata("type", target, "location"); // 1
Reflect.getMetadata("type", target, "description"); // 6