Typescript: тип, который позволяет только объекты, которые реализуют тот же интерфейс - PullRequest
0 голосов
/ 19 марта 2020

Как я могу заставить environment.service принимать только те значения, которые реализуют ServiceInterface?

interface ServiceInterface {
  id: string
}

class ServiceA implements ServiceInterface {
  id = 'a'
}

class ServiceB implements ServiceInterface {
  id = 'b'
}

interface Environment {
  service: ServiceInterface
}

const environment: Environment = {
  service: ServiceA // TS2741: Property 'id' is missing in type 'typeof ServiceA'...
}

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

Причина, по которой я не могу использовать экземпляр service: new ServiceA(), заключается в том, что я использую Angular, где внедрение зависимостей заботится о создании экземпляра класса. Я должен предоставить класс для системы внедрения зависимостей. Для этого я импортирую файл среды, в котором мне нужно убедиться, что добавленный там класс реализует интерфейс.

Ответы [ 2 ]

1 голос
/ 19 марта 2020

Нашли решения благодаря этому

interface ServiceInterface {
  id: string
}

type Implements<T> = new (...args: any[]) => T;

class ServiceA implements ServiceInterface {
  id = 'a'
}

class ServiceB implements ServiceInterface {
  id = 'b'
}

interface Environment {
  service: Implements<ServiceInterface>
}

const environment: Environment = {
  service: ServiceB
}
1 голос
/ 19 марта 2020

Когда вы пишете

const environment: Environment = {
  service: ServiceA
}

, значение ключа service является не экземпляром класса ServiceA, а самим классом.

Вам необходимо передать фактический экземпляр класса для удовлетворения ограничения:

const environment: Environment = {
  service: new ServiceA()
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...