Класи TypeScript (і JavaScript) підтримують суворе єдине успадкування. Отже, ви не зможете робити:
classUserextendsTagged,Timestamped { // ERROR : no multiple inheritance}
ший спосіб побудови класів із багаторазово використовуваних компонентів — побудувати їх шляхом об’єднання простіших часткових класів, які називаються міксинами.
Ідея проста: замість того, щоб class A extending class B to get its functionality,щоб отримати його функціональність, function B takes class A і повертає новий клас із цією доданою функціональністю. Функція B є міксином.
[Міксин — це] функція, яка
бере конструктор,
створює клас, який розширює цей конструктор новою функціональністю
повертає новий клас
Повний приклад
// Ніобхідно для всіх міксіновtypeConstructor<T= {}> =new (...args:any[]) =>T;////////////////////// Приклад mixins////////////////////// Мixin який додає властивістьfunctionTimestamped<TBaseextendsConstructor>(Base:TBase) {returnclassextendsBase { timestamp =Date.now(); };}// Мixin який додає властивість та методиfunctionActivatable<TBaseextendsConstructor>(Base:TBase) {returnclassextendsBase { isActivated =false;activate() {this.isActivated =true; }deactivate() {this.isActivated =false; } };}////////////////////// використання////////////////////// Простий classclassUser { name ='';}// User that is TimestampedconstTimestampedUser=Timestamped(User);// User that is Timestamped and ActivatableconstTimestampedActivatableUser=Timestamped(Activatable(User));////////////////////// Использование расширеного classes////////////////////consttimestampedUserExample=newTimestampedUser();console.log(timestampedUserExample.timestamp);consttimestampedActivatableUserExample=newTimestampedActivatableUser();console.log(timestampedActivatableUserExample.timestamp);console.log(timestampedActivatableUserExample.isActivated);
Розкладемо цей приклад.
Take a constructor
Міксини беруть клас і розширюють його новими функціями. Отже, нам потрібно визначити, що таке constructor. Легко, як:
// Needed for all mixinstypeConstructor<T= {}> =new (...args:any[]) =>T;
Extend the class and return it
Досить легко:
// A mixin that adds a propertyfunctionTimestamped<TBaseextendsConstructor>(Base:TBase) {returnclassextendsBase { timestamp =Date.now(); };}