Класс Typescript не может реализовать простой интерфейс с конструктором? - PullRequest
0 голосов
/ 07 мая 2020

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

BaseEntity.ts:

export interface IBaseEntity {
  id: string
  new(_id?: string, _data?: any)
}

Test.ts:

class Test implements IBaseEntity {
  id: string
  constructor(_id?: string, _data?: any) {
    this.id = 'MOCK_ID'
  }
}

ошибка:

Class 'Test' incorrectly implements interface 'IBaseEntity'.
  Type 'Test' provides no match for the signature 'new (_id?: string | undefined, _data?: any): any'.

Я надеюсь, что кто-то сможет быстро указать, в чем проблема, потому что мне кажется, что это правильно. Заранее всем спасибо.

1 Ответ

3 голосов
/ 07 мая 2020

Это неправильное понимание того, что делает implements. implements гарантирует, что тип экземпляра класса выполняет контракт, указанный интерфейсом. Конструктор класса не является частью типа экземпляра, он является частью класса типа (статическая c часть класса).

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

export interface IBaseEntity {
  id: string

}

export interface IBaseEntityClass {
    new(_id?: string, _data?: any): IBaseEntity
}


class Test implements IBaseEntity {
  id: string
  constructor(_id?: string, _data?: any) {
    this.id = 'MOCK_ID'
  }
}
let baseEntityClass: IBaseEntityClass = Test; // The class test fulfills the contract of IBaseEntityClass

new baseEntityClass("", {}) // constructing through IBaseEntityClass interface

Ссылка на игровую площадку

В настоящее время нет способа указать, что тип класса должен реализовывать определенный интерфейс c, но вы получите ошибки при назначении let baseEntityClass: IBaseEntityClass = Test, если Test не имеет правильного конструктора.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...