Концепції TypeScript: Mixins vs DecoratorsДумаю було б корисно почати створювати дописи і про
TypeScript/JavaScript. Це звичайно не кодинг, а більш концептуальні теми, розуміння яких стало важливішим з приходом АІ.
DecoratorsФактично - це функція, яку можна прикріпити до класу, методу, параметра або поля за допомогою синтаксису
@. Його задача додати або змінити поведінку конкретної сутності.
Наприклад, розберемо типовий метод контролера в Nest.js:
@Post()
@UseGuards(AuthGuard)
async createTrip() {}
Post() - додає поведінку, яка вказує, що метод має обробляти HTTP POST запити.
UseGuards(AuthGuard) - додає поведінку, яка перевірить чи користувач авторизований, перед викликом цього метода.
MixinsВони теж дозволяють додавати поведінку, але працюють інакше, ніж decorators. Їхня основна задача - розширити клас через композицію
(бо множинного наслідування немає).
Технічно - це функція, яка приймає клас і повертає новий клас з додатковими методами або полями.
Наприклад, в нас є бізнес логіка кешування (методи і поля), які спільні для всіх хто буде їх використовувати. Тоді логічно використати mixin, щоб розширити функціонал і паралельно не мати жорсткої завʼязки, як у випадку з наслідуванням.
class CachedTripsService extends WithCache(TripsService) {}
// В нас немає завʼязки з класом і при необхідності можна розширити його ще більше
Sentry(With)class CachedTripsService extends WithCache(TripsService) {}Коли і що використовувати?Тут все дуже просто, якщо потрібно розширити/змінити поведінку пробуєте використати decorators, в більшості випадків їх буде достатньо.
Якщо бачите, що вам потрібно створювати нові методи/поля, які будуть використовуватись в рамках класу, тоді створюєте mixin.