Изучение наследования нескольких классов в TypeScript

В TypeScript классы являются фундаментальным строительным блоком объектно-ориентированного программирования. Хотя TypeScript не поддерживает наследование нескольких классов напрямую, существует несколько методов, которые можно использовать для достижения аналогичной функциональности. В этой статье мы рассмотрим различные методы расширения нескольких классов в TypeScript, а также приведем примеры кода.

Метод 1: Миксины
Миксины позволяют объединить несколько классов в один класс. Вот пример:

class Base {
  baseMethod() {
    console.log("Base method");
  }
}
class Mixin1 {
  mixin1Method() {
    console.log("Mixin 1 method");
  }
}
class Mixin2 {
  mixin2Method() {
    console.log("Mixin 2 method");
  }
}
class DerivedClass extends Base implements Mixin1, Mixin2 {
  derivedMethod() {
    console.log("Derived method");
  }
}
const instance = new DerivedClass();
instance.baseMethod();     // Output: Base method
instance.mixin1Method();   // Output: Mixin 1 method
instance.mixin2Method();   // Output: Mixin 2 method
instance.derivedMethod();  // Output: Derived method

Метод 2: композиция
Композиция предполагает создание нового класса, содержащего экземпляры нескольких классов. Вот пример:

class Base1 {
  base1Method() {
    console.log("Base 1 method");
  }
}
class Base2 {
  base2Method() {
    console.log("Base 2 method");
  }
}
class CompositeClass {
  private base1: Base1;
  private base2: Base2;
  constructor() {
    this.base1 = new Base1();
    this.base2 = new Base2();
  }
  compositeMethod() {
    console.log("Composite method");
  }
  base1Method() {
    this.base1.base1Method();
  }
  base2Method() {
    this.base2.base2Method();
  }
}
const instance = new CompositeClass();
instance.compositeMethod(); // Output: Composite method
instance.base1Method();     // Output: Base 1 method
instance.base2Method();     // Output: Base 2 method

Метод 3: Декораторы
Декораторы TypeScript позволяют изменять поведение класса. Вы можете использовать декораторы для добавления функциональности из нескольких источников. Вот пример:

function Mixin1<T extends { new (...args: any[]): {} }>(constructor: T) {
  return class extends constructor {
    mixin1Method() {
      console.log("Mixin 1 method");
    }
  };
}
function Mixin2<T extends { new (...args: any[]): {} }>(constructor: T) {
  return class extends constructor {
    mixin2Method() {
      console.log("Mixin 2 method");
    }
  };
}
@Mixin1
@Mixin2
class MyClass {
  baseMethod() {
    console.log("Base method");
  }
}
const instance = new MyClass();
instance.baseMethod();    // Output: Base method
instance.mixin1Method();  // Output: Mixin 1 method
instance.mixin2Method();  // Output: Mixin 2 method

Хотя TypeScript напрямую не поддерживает множественное наследование классов, аналогичной функциональности можно добиться с помощью примесей, композиции или декораторов. Миксины позволяют объединять несколько классов в один класс, композиция предполагает создание нового класса, содержащего экземпляры нескольких классов, а декораторы позволяют изменять поведение класса, добавляя функциональность из нескольких источников. Понимание этих методов позволит вам писать более гибкий и повторно используемый код на TypeScript.