TypeScript (и JavaScript) классы поддерживают строго одиночное наследование. К примеру, вы не можете сделать следующее:
123
classUserextendsTagged,Timestamped{// ОШИБКА : невозможно множественное наследование}
Еще один способ создания классов из повторно используемых компонентов - путем объединения более простых частичных классов, называемых миксины.
Идея проста: вместо класса A, расширяющего класс B для получения своей функциональности, функция B принимает класс A и возвращает новый класс с этой добавленной функциональностью. Функция B - это миксин.
[Миксин] - это функция, которая
берет конструктор
создает класс, расширяющий этот конструктор новыми функциями
// Требуется для всех миксиновtypeConstructor<T={}>=new(...args:any[])=>T;////////////////////// Примеры миксинов////////////////////// Миксин, который добавляет свойствоfunctionTimestamped<TBaseextendsConstructor>(Base:TBase){returnclassextendsBase{timestamp=Date.now();};}// миксин, который добавляет свойство и методыfunctionActivatable<TBaseextendsConstructor>(Base:TBase){returnclassextendsBase{isActivated=false;activate(){this.isActivated=true;}deactivate(){this.isActivated=false;}};}////////////////////// Использование для создания классов////////////////////// Простой классclassUser{name='';}// Пользователь с отметкой времениconstTimestampedUser=Timestamped(User);// Пользователь с отметкой времени и доступный для активацииconstTimestampedActivatableUser=Timestamped(Activatable(User));////////////////////// Использование созданных классов////////////////////consttimestampedUserExample=newTimestampedUser();console.log(timestampedUserExample.timestamp);consttimestampedActivatableUserExample=newTimestampedActivatableUser();console.log(timestampedActivatableUserExample.timestamp);console.log(timestampedActivatableUserExample.isActivated);