Возвращаемый тип для унаследованных классов TypeScript не работает - PullRequest
1 голос
/ 11 апреля 2020

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

abstract class Base {
  abstract clone(): this;
}

class Impl extends Base {
  clone(): this {
    return new Impl();
  }
}

К сожалению, я получаю эту ошибку.

Тип 'Impl' нельзя назначить для типа 'this'. «Impl» присваивается ограничению типа «this», но можно создать экземпляр «this» с другим подтипом ограничения «Impl». (2322)

Я могу обойти это с помощью приведения волхвы c:

abstract class Base {
  abstract clone(): this;
}

class Impl extends Base {
  clone(): this {
    return new Impl() as this;
  }
}

... но я не понимаю, почему это необходимо. Почему new Impl() не относится к типу this?

1 Ответ

0 голосов
/ 11 апреля 2020

Ошибка говорит, что, если вы подкласс Impl, функция clone() вашего результирующего подтипа не будет соответствовать определенным ограничениям.

class Impl2 extends Impls {
}

const impl2 = new Impl2();
impl2.clone(); // method would return Impl type, instead of Impl2 type, so `this` is not correct constraint.

На данный момент, пока есть обходной путь для предотвращения При дальнейшем наследовании от Impl класса с использованием private contructor() служба компилятора / языка по-прежнему будет сообщать об ошибке, поскольку нет способа пометить класс как sealed / final.

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