Можно ли принудительно применять типы параметров конструктора с помощью `extends` или` Implements` в TypeScript? - PullRequest
0 голосов
/ 16 сентября 2018

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

  1. Абстрактный тип конструктора в TypeScript

  2. Как `конструктор типов = Function & {prototype: T}` применяется к типам конструктора Abstract в TypeScript?

  3. Конструктор Abstract для класса Abstract в 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() в интерфейсе для этой цели,Возможно, есть и другие способы.

1 Ответ

0 голосов
/ 16 сентября 2018

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

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")
);

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

...