0.1.7 • Published 9 months ago

@e22m4u/ts-reflector v0.1.7

Weekly downloads
-
License
MIT
Repository
github
Last release
9 months ago

@e22m4u/ts-reflector

Типизированная обертка для Metadata Reflection API

Установка

npm install @e22m4u/ts-reflector

Экспериментальные декораторы

Для включения поддержки экспериментальных декораторов, добавьте указанные ниже опции в файл tsconfig.json вашего проекта.

{
  "emitDecoratorMetadata": true,
  "experimentalDecorators": true
}

MetadataKey\<T>

Ниже приведен пример использования ключа MetadataKey<T> для хранения метаданных. Значение проверяется на соответствие заданному ключу перед сохранением. Кроме того, тип метаданных будет автоматически выведен при извлечении по ключу.

import {Reflector} from '@e22m4u/ts-metadata';
import {MetadataKey} from '@e22m4u/ts-metadata';

type MyData = {foo: string};
class Target {/* ... */}

// создание ключа MetadataKey<T>
// для мета-данных типа MyData
const key = new MetadataKey<MyData>();

// назначение мета-данных классу Target
// с помощью метода `defineMetadata`
Reflector.defineMetadata(key, {foo: 'bar'}, Target);

// метод `defineMetadata` проверяет тип устанавливаемого
// значения на соответствие ключу MetadataKey<MyData>,
// где допустимым значением является MyData
Reflector.defineMetadata(key, 'string', Target);
// TypeError: Argument of type 'string' is not assignable
// to parameter of type MyData.

// тип возвращаемых значений методов `getMetadata`
// и `getOwnMetadata` выводится согласно ключу
const result = Reflector.getMetadata(key, Target); // MyData

getDecoratorTargetType

Утилита getDecoratorTargetType предоставляет простой способ определить, где применен декоратор в вашем коде. При написании пользовательских декораторов часто необходимо различное поведение в зависимости от того, используется ли декоратор для класса, метода, свойства или параметра. Эта утилита возвращает значение enum, указывающее точное место применения декоратора.

import {getDecoratorTargetType} from '@e22m4u/ts-metadata';
import {DecoratorTargetType as DTT} from '@e22m4u/ts-metadata';

// объявление декоратора
function myDecorator(
  target: object,
  propertyKey?: string,
  descriptorOrIndex?: PropertyDescriptor | number,
) {
  // передача всех аргументов
  // декоратора в утилиту
  const type = getDecoratorTargetType(
    target,
    propertyKey,
    descriptorOrIndex,
  );
  // проверка места применения декоратора
  // используя значение enum
  if (type === DTT.CONSTRUCTOR)
    console.log('@myDecorator is applied to a class');
  if (type === DTT.STATIC_METHOD)
    console.log('@myDecorator is applied to a static method');
  if (type === DTT.INSTANCE_METHOD)
    console.log('@myDecorator is applied to an instance method');
  if (type === DTT.STATIC_PROPERTY)
    console.log('@myDecorator is applied to a static property');
  if (type === DTT.INSTANCE_PROPERTY)
    console.log('@myDecorator is applied to an instance property');
  if (type === DTT.CONSTRUCTOR_PARAMETER)
    console.log('@myDecorator is applied to a constructor parameter');
  if (type === DTT.STATIC_METHOD_PARAMETER)
    console.log('@myDecorator is applied to a static method parameter');
  if (type === DTT.INSTANCE_METHOD_PARAMETER)
    console.log('@myDecorator is applied to an instance method parameter');
};

Тесты

npm run test

Лицензия

MIT

0.1.7

9 months ago

0.1.4

1 year ago

0.1.3

1 year ago

0.1.6

1 year ago

0.1.5

1 year ago

0.1.2

1 year ago

0.1.0

1 year ago

0.1.1

1 year ago

0.0.2

2 years ago

0.0.1

2 years ago