TypeScript 1.5 теперь имеет декораторы .
Может ли кто-нибудь привести простой пример, демонстрирующий правильный способ реализации декоратора, и описать, что означают аргументы в возможных действительных сигнатурах декоратора?
declare type ClassDecorator = <TFunction extends Function>(target: TFunction) => TFunction | void;
declare type PropertyDecorator = (target: Object, propertyKey: string | symbol) => void;
declare type MethodDecorator = <T>(target: Object, propertyKey: string | symbol, descriptor: TypedPropertyDescriptor<T>) => TypedPropertyDescriptor<T> | void;
declare type ParameterDecorator = (target: Function, propertyKey: string | symbol, parameterIndex: number) => void;
Кроме того, есть ли какие-либо рекомендации, которые следует учитывать при реализации декоратора?
typescript
decorator
Дэвид Шеррет
источник
источник
@Injectable
добавить в декоратор, обратитесьОтветы:
В итоге я поиграл с декораторами и решил задокументировать то, что выяснил, для тех, кто хочет воспользоваться этим, до того, как появится какая-либо документация. Пожалуйста, не стесняйтесь редактировать это, если вы видите какие-либо ошибки.
Общие пункты
Метод / Формальный Accessor Decorator
Параметры реализации:
target
: Прототип класса (Object
).propertyKey
: Название метода (string
|symbol
).descriptor
: ATypedPropertyDescriptor
- Если вы не знакомы с ключами дескриптора, я рекомендовал бы читать об этом в этой документации наObject.defineProperty
(это третий параметр).Пример - без аргументов
Использование:
Реализация:
Входные данные:
Вывод:
Ноты:
this
не будет экземпляром, если вы делаете.@enumerable(false)
и@log
одновременно (пример: плохо против хорошего )TypedPropertyDescriptor
может использоваться для ограничения того, какие сигнатуры метода ( Пример метода ) или сигнатуры средства доступа ( Пример средства доступа ) можно использовать для декоратора.Пример - с аргументами (фабрика декораторов)
При использовании аргументов вы должны объявить функцию с параметрами декоратора, а затем вернуть функцию с сигнатурой примера без аргументов.
Статический метод Decorator
Похож на метод декоратор с некоторыми отличиями:
target
параметром является сама функция конструктора, а не прототип.Класс Декоратор
Параметр реализации:
target
: Класс декоратор объявлен на (TFunction extends Function
).Пример использования : использование метаданных api для хранения информации о классе.
Декоратор недвижимости
Параметры реализации:
target
: Прототип класса (Object
).propertyKey
: Название объекта (string
|symbol
).Пример использования : создание
@serialize("serializedName")
декоратора и добавление имени свойства в список свойств для сериализации.Параметр Декоратор
Параметры реализации:
target
: Прототип класса (Function
кажется,Function
он больше не работает. Вы должны использоватьany
илиObject
здесь, чтобы использовать декоратор в любом классе. Или указать тип (типы) класса, которым вы хотите его ограничить)propertyKey
: Название метода (string
|symbol
).parameterIndex
: Индекс параметра в списке параметров функции (number
).Простой пример
Подробный пример (ы)
источник
target
или чтоprototype of the class
иkey
относится, может кто-нибудь, пожалуйста, уточните это?Одна важная вещь, которую я не вижу в других ответах:
Фабрика декораторов
Обратитесь к главе «Декораторы» в руководстве по TypeScript .
источник
Вы можете реализовать что-то, что регистрирует каждый вызов консоли:
источник