TypeScript 1.5 ma teraz dekoratory .
Czy ktoś mógłby podać prosty przykład pokazujący właściwy sposób implementacji dekoratora i opisać, co oznaczają argumenty w możliwych prawidłowych podpisach dekoratora?
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;
Ponadto, czy są jakieś względy dotyczące najlepszych praktyk, o których należy pamiętać przy wdrażaniu dekoratora?
typescript
decorator
David Sherret
źródło
źródło
@Injectable
dekoratorowi, zapoznaj się zOdpowiedzi:
W końcu bawiłem się z dekoratorami i postanowiłem udokumentować to, co wymyśliłem dla każdego, kto chce skorzystać z tego, zanim pojawi się jakakolwiek dokumentacja. Jeśli zauważysz jakieś błędy, edytuj to.
Punkty ogólne
Method / Formal Accessor Decorator
Parametry realizacji:
target
: Prototyp klasy (Object
).propertyKey
: Nazwa metody (string
|symbol
).descriptor
: ATypedPropertyDescriptor
- Jeśli nie znasz kluczy deskryptora, polecam przeczytać o tym w tej dokumentacji naObject.defineProperty
(jest to trzeci parametr).Przykład - bez argumentów
Posługiwać się:
Realizacja:
Wejście:
Wynik:
Uwagi:
this
instancji.@enumerable(false)
i@log
jednocześnie (przykład: Zły kontra Dobry )TypedPropertyDescriptor
może służyć do ograniczenia podpisów metod ( Przykład metody ) lub podpisów modułu dostępu ( Przykład modułu dostępu), w których można umieścić dekorator.Przykład - z argumentami (fabryka dekoratorów)
Używając argumentów, musisz zadeklarować funkcję z parametrami dekoratora, a następnie zwrócić funkcję z podpisem przykładu bez argumentów.
Dekorator metody statycznej
Podobne do dekoratora metod z pewnymi różnicami:
target
parametrem jest sama funkcja konstruktora, a nie prototyp.Dekorator klasy
Parametr wykonania:
target
: Klasa, w której dekorator jest zadeklarowany (TFunction extends Function
).Przykład użycia : użycie interfejsu API metadanych do przechowywania informacji o klasie.
Dekorator nieruchomości
Parametry realizacji:
target
: Prototyp klasy (Object
).propertyKey
: Nazwa właściwości (string
|symbol
).Przykład zastosowania : tworzenie
@serialize("serializedName")
dekoratora i dodawanie nazwy właściwości do listy właściwości do serializacji.Dekorator parametrów
Parametry realizacji:
target
: Prototyp klasy (Function
- wydaje się,Function
że już nie działa. Powinieneś użyćany
lubObject
tutaj teraz, aby użyć dekoratora w dowolnej klasie. Lub określ typy klas, do których chcesz je ograniczyć)propertyKey
: Nazwa metody (string
|symbol
).parameterIndex
: Indeks parametru na liście parametrów funkcji (number
).Prosty przykład
Szczegółowy przykład
źródło
target
iprototype of the class
czykey
odnosi się do tego, czy ktoś mógłby to rozwinąć?Jedną ważną rzeczą, której nie widzę w innych odpowiedziach:
Fabryka dekoratorów
Zobacz rozdział Dekoratory w podręczniku TypeScript .
źródło
Możesz zaimplementować coś, co rejestruje każde wywołanie konsoli:
źródło