Можно ли принудительно использовать типы параметров конструктора с помощью `extends` или` Implements` в TypeScript?

Я посмотрел на все следующее:

  1. Тип абстрактного конструктора в TypeScript

  2. Как `type Constructor‹ T ›= Function & {prototype: T}` применить к типам абстрактных конструкторов в TypeScript?

  3. Абстрактный конструктор в абстрактном классе в TypeScript

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

Это (в упрощенном смысле) то, что я хотел бы сделать:

abstract class HasStringAsOnlyConstructorArg {
  abstract constructor(str: string);
}

class NamedCat extends HasStringAsOnlyConstructorArg {
  constructor(name: string) { console.log(`meow I'm ${name}`); }
}

class Shouter extends HasStringAsOnlyConstructorArg {
  constructor(phrase: string) { console.log(`${phrase}!!!!!!`); }
}

const creatableClasses: Array<typeof HasStringAsOnlyConstructorArg> = [NamedCat, Shouter];
creatableClasses.forEach(
  (class: typeof HasStringAsOnlyConstructorArg) => new class("Sprinkles")
);

В приведенном выше примере вы можете видеть, что и Shouter, и NamedCat используют одну строку для своего конструктора. Им не обязательно расширять класс, они могут реализовать интерфейс или что-то в этом роде, но я действительно хочу иметь возможность хранить список классов, для построения которых требуются одни и те же аргументы.

Можно ли принудительно применить типы параметров конструктора классов с помощью extends или implements в TypeScript?

РЕДАКТИРОВАТЬ: «Возможный дубликат», кажется, показывает, как невозможно использовать new() в интерфейсе для этой цели. Возможно, есть еще другие способы.


person Seph Reed    schedule 16.09.2018    source источник
comment
Возможный дубликат Как работают интерфейсы машинописного текста с конструктивными подписями?   -  person Fabian Lauer    schedule 17.09.2018


Ответы (1)


Вы можете сделать такое принуждение к самому массиву, поэтому он будет разрешать только конструкторы с одним строковым аргументом:

class NamedCat {
    constructor(name: string) { console.log(`meow I'm ${name}`); }
}

class Shouter {
    constructor(phrase: string) { console.log(`${phrase}!!!!!!`); }
}

type ConstructorWithSingleStringArg = new (args: string) => any;

const creatableClasses: Array<ConstructorWithSingleStringArg> = [NamedCat, Shouter];
creatableClasses.forEach(
    ctor => new ctor("Sprinkles")
);

Детская площадка

person Aleksey L.    schedule 16.09.2018