Как сделать функцию, которая вернет расширенный класс?

Для создания функции, которая возвращает расширенный класс в TypeScript, вам понадобится использовать концепцию наследования классов и ключевое слово extends.

Для начала, вам потребуется определить базовый класс, который будет содержать основные свойства и методы. Например, давайте создадим класс Person:

class Person {
  constructor(public name: string, public age: number) {}

  sayHello() {
    console.log(`Hello, my name is ${this.name} and I am ${this.age} years old.`);
  }
}

Теперь, если хотите создать функцию, которая возвращает расширенный класс, вы можете использовать концепцию генерических типов. Создадим, например, функцию extendClass, которая принимает базовый класс и объект с дополнительными свойствами:

function extendClass<T extends Person>(baseClass: T, extraProperties: object): T {
  class ExtendedClass extends baseClass {
    constructor(...args: any[]) {
      super(...args);
      Object.assign(this, extraProperties);
    }
  }
  
  return ExtendedClass as any;
}

В этой функции мы определяем новый класс ExtendedClass, который наследует все свойства и методы базового класса (baseClass). Затем, используя Object.assign, мы копируем все свойства из объекта extraProperties в созданный экземпляр расширенного класса.

Наконец, возвращаемый тип T гарантирует, что функция extendClass будет возвращать тот же класс, который мы передали в качестве базового.

Теперь, чтобы использовать эту функцию, вы можете создать новый класс, расширенный от Person, и добавить дополнительные свойства:

const ExtendedPerson = extendClass(Person, { profession: 'developer' });

const person = new ExtendedPerson('John', 30);

console.log(person); // ExtendedPerson { name: 'John', age: 30, profession: 'developer' }

person.sayHello(); // Hello, my name is John and I am 30 years old.

Таким образом, вы получите расширенный класс, который содержит все свойства и методы базового класса, плюс дополнительные свойства, переданные в функцию extendClass.