Почти всеки знае какво представляват декораторите на TypeScript, има много статии по тази тема. Няма да ви губя времето да описвам какви са те и защо трябва да ги използвате (или не). В тази статия ще говорим за някои усъвършенствани практики за декоратори на TypeScript. Ако не сте запознати с декораторите на TypeScript, първо вижте „официалната документация“.

Нека започнем с декоратори на имоти. Ето дефиницията на типа на PropertyDecorator от TypeScript lib.

Декораторът на свойства е просто функция, която получава обект, който съдържа свойство и ключ на свойство.

Нека напишем прост декоратор на свойства, който извършва известно регистриране.

Този декоратор пише в екземпляра на конзолата и ключа на полето. Изглежда е наред, но Object не предоставя никаква информация за типа на екземпляра. Например, нека се опитаме да зададем някакво свойство в декоратора:

Грешката беше очаквана, Object не знае нищо за a или други полета. Нека се опитаме изрично да дефинираме типа obj:

Сега кодът е правилен и можем да зададем поле a. Но какво ще стане, ако се опитаме да използваме този декоратор за клас без aполе.

Добавихме този декоратор към клас A, който не имплементира интерфейс WithA и TypeScript не показва никаква грешка. Защо???!!! Обичаме TypeScript за проверка на типа, за да избегнем неочаквано поведение по време на изпълнение. Но в този случай TypeScript дори не ни предупреди за възможна грешка.

Как да го решим? Може би можем да създадем наша собствена дефиниция на тип за PropertyDecorator, която ще изведе грешка в този случай:

Съвсем същото е с оригиналния PropertyDecorator, просто добавихме проверка дали Tразширява Base. Типът по подразбиране за Base е any, тъй като ограничението на типа не винаги е необходимо. Също така го нарекохме TPropertyDecorator, за да избегнем сблъсък с типа PropertyDecorator. Нека проверим как работи с предишния пример:

Получихме типова грешка! Сега работи според очакванията. Нека се опитаме да го поправим:

Всичко работи според очакванията. TPropertyDecoratorможе да провери къде е бил използван и да изведе грешка във времето на компилиране, ако класът не отговаря на изискванията му.

Заключение: в тази статия научихме някои крайни случаи на използване на bultin PropertyDecoratorдефиниция на тип и как да ги избегнем. Надявам се тази статия да е била полезна.

До следващия път, servus!