@Wan-Derer
Зобанели на Хабре, волки́ ;((

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

Всем привет!
У меня есть абстрактный класс Control и его наследники: CheckBox, Select, Date... , пара десятков. В них есть данные и логика. Хочу в рантайме создавать экземпляры этих классов по их названию. Можно так:
if (clazz === 'cbox') return new CheckBox();
// и ещё два десятка IF

Или через длинный switch-case.

А есть ли способ лучше? Например, в MAP поместить пары:
const controlMap = new Map<string, Control>([
  ['cbox',  что-то-такое ],
  ['date',  что-то-такое ],
// 20 строчек
]);

из которых можно получать новые экземпляры.

Или ещё каким способом?
  • Вопрос задан
  • 71 просмотр
Решения вопроса 1
что-то-такое

И что мешает сюда положить конструктор? В expression-контексте имя класса это функция-конструктор

class Thing {}

class Foo extends Thing {
    public readonly f: number;

    public constructor() {
        super();
        this.f = 10;
    }
}

class Bar extends Thing {
    public readonly b: string;

    public constructor() {
        super();
        this.b = "nope";
    }
}

type ThingName = "foo" | "bar"

const things = new Map<ThingName, typeof Thing>([
    ["foo", Foo],
    ["bar", Bar],
]);

const ctor = things.get("foo")!;
const t = new ctor();
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы