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
→ Ссылка