TypeScript, можно ли создавать экземпляры класса по имени?

Да, в TypeScript есть возможность создавать экземпляры класса по имени. Данная функциональность достигается с помощью функции new и оператора typeof или функции eval.

Для начала, рассмотрим использование оператора typeof. Оператор typeof позволяет получить строковое представление имени класса. Например, если у нас есть класс Example, мы можем получить его имя с помощью typeof Example. Затем мы можем использовать это имя вместо самого класса для создания экземпляра. Например:

class Example {
  constructor() {
    console.log('Экземпляр класса Example создан');
  }
}

const className = 'Example';
const instance = new (typeof className)();

В этом примере мы сохраняем имя класса 'Example' в переменной className. Затем мы используем оператор typeof className, чтобы получить строковое представление имени класса. Наконец, мы используем это имя, обернутое в оператор new, чтобы создать экземпляр класса.

Теперь рассмотрим использование функции eval. Функция eval позволяет выполнять код, представленный строкой. Мы можем использовать ее для создания экземпляра класса по имени. Вот пример:

class Example {
  constructor() {
    console.log('Экземпляр класса Example создан');
  }
}

const className = 'Example';
const instance = eval('new ' + className + '()');

В этом примере мы используем функцию eval, чтобы выполнить строку 'new Example()'. Это создаст экземпляр класса Example. Заметьте, что использование eval может быть небезопасно, поэтому рекомендуется использовать его с осторожностью, особенно если вы выполняете произвольный код.

В обоих случаях, при создании экземпляра класса по имени, важно убедиться, что имя класса исключено из маршрута оптимизации TypeScript. Для этого, можно использовать аннотацию @ts-ignore перед объявлением экземпляра класса:

// @ts-ignore
const instance = new (typeof className)();

или

// @ts-ignore
const instance = eval('new ' + className + '()');

Теперь у вас есть два способа создать экземпляр класса по имени в TypeScript. Помните, что использование typeof или eval может создавать потенциальные проблемы безопасности, поэтому следует применять их с осторожностью.