Используйте функцию, которая возвращает конкретный экземпляр в качестве значения карты.
Обновление : приведенное ниже предложение действительно только для deno
As предложение лучше использовать тип Record
вместо Map
, так как в противном случае неправильные ключи (mymap.get("concrete3")()
) будут замечены как исключения времени выполнения.
abstract class AbstractFoo {
abstract foo(): number;
}
class Concrete1 extends AbstractFoo {
foo() {
return 1;
}
}
class Concrete2 extends AbstractFoo {
foo() {
return 2;
}
}
const myMap: Record<string, () => AbstractFoo> = {
"concrete1": () => new Concrete1(),
"concrete2": () => new Concrete2(),
};
const instantiatedConcrete1 = myMap.concrete1();
let fooResult = instantiatedConcrete1.foo();
Как отмечено в комментариях, обратите внимание, что я использовал фабричный шаблон для создания объектов.
Это признано хорошим шаблоном дизайна, но когда не требуется, может быть более подходящим решение на основе конструктора:
const myRec: Record<string, new() => AbstractFoo> = {
"concrete1": Concrete1,
"concrete2": Concrete2,
};
const iConcrete1 = new myRec.concrete1();
Синтаксис new() => AbstractFoo
определяет сигнатуру конструктора, который не принимает аргументов и возвращает объект с формой AbstractFoo
.