У меня есть интерфейс и класс:

interface Widget {
  widgetStuff(): void;
}

class Foo implements Widget {
  widgetStuff(): void {
  }
}

Я хочу отслеживать все Widget в другом классе, и подпись индекса кажется самым простым способом:

class WidgetCatalog {
  private readonly mapping: { [key: string]: Widget };

  constructor() {
    this.mapping = {
      Foo // <= Error here
    }
  }
}

Я получаю эту ошибку: error TS2322: Type 'typeof Foo' is not assignable to type 'Widget'. Property 'widgetStuff' is missing in type 'typeof Foo'.

Я не уверен, что мне здесь не хватает, так как это кажется довольно простой реализацией. Нужно ли мне по-другому указывать тип значения в подписи индекса?

0
Chad 3 Окт 2019 в 22:31

1 ответ

Лучший ответ

@jcalz указал мне правильное направление. Эта версия работает:

interface Widget {
  widgetStuff(): void;
}

class Foo implements Widget {
  widgetStuff(): void {
  }
}

class WidgetCatalog {
  // Change to mapping of Widget constructors
  private readonly mapping: { [key: string]: new(...args) => Widget };

  constructor() {
    this.mapping = {
      Foo
    }
  }
}
1
Chad 3 Окт 2019 в 19:50