Задать вопрос
johnymkp
@johnymkp

Как типизировать переменную под хранение классов?

У меня есть интерфейс вида
interface IStorage<T, K>
и класс, содержащий базовую реализацию
class Storage<T, K> implements IStorage<T, K>
а еще несколько классов, которые закрывают типы в этом дженерике, например
class MatchStorage extends Storage<Match, number>
У меня есть конфиг, согласно которому создаются хранилища в indexeddb. В том же конфиге я хочу сделать поле, в котором должен храниться класс, соответствующий этому хранилищу. Выглядит примерно так:
const matchStorageConfig: IStorageConfig = {
  storageName: StorageName.Matches,
  oftype: MatchStorage,  // MatchStorage - это класс из примера выше


Когда я создаю хранилища, то следом создаю экземпляры класса для работы с этими хранилищами. Т.е. это по задумке должно выглядеть примерно так: берем из поля oftype класс и создаем экземпляр:
const instance = new oftype(тут аргументы);

Вопрос в том, как мне правильно типизировать oftype, чтобы туда:
* Можно было положить только классы, реализующие IStorage.
* Типы в IStorage могли быть любые, например, IStorage<User, number>, IStorage<Player, string> и т.д.
interface IStorageConfig {
  oftype: ??????? как описать тип под такую задачу
  • Вопрос задан
  • 60 просмотров
Подписаться 1 Простой 4 комментария
Пригласить эксперта
Ответы на вопрос 1
Alexandroppolus
@Alexandroppolus
кодир
interface IStorageConfig<T, K> {
    oftype: new () => IStorage<T, K>;
}

const matchStorageConfig: IStorageConfig<Match, number> = {
    oftype: MatchStorage
}

const s = new matchStorageConfig.oftype();


здесь предполагается, что у всех твоих стораджей есть конструктор без параметров.
Если хочешь какие-то параметры, то их надо либо делать одинаковыми для всех стораджей (и тогда указать в круглых скобках сразу после new в интерфейсе IStorageConfig), либо в этом нет смысла
Ответ написан
Ваш ответ на вопрос

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

Похожие вопросы