Я пытаюсь сделать то, что, как я думаю, является «учебником» для полиморфного this
, и он не работает, и я просто не могу понять это. Представьте себе, у меня есть некоторый abstract
базового класса, который клонируемый, например:Полиморфно это в TypeScript
abstract class X {
abstract clone(): this;
}
Теперь я хочу, чтобы реализовать базовый класс, который обеспечивает clone
реализацию:
class Y extends X {
constructor(private x: number) { super() }
clone(): this { return new Y(this.x + 1); }
}
Когда я делаю это, я получаю сообщение об ошибке что говорит Type Y is not assignable to type 'this'
. Я совершенно смущен. Все, что я хочу передать здесь, это ограничение типа, которое, если подкласс X
имеет вызванный метод clone
, что тип вещи, который вы получите, будет идентичен подтипу. Разве это не то, что полиморфный this
? Что я здесь делаю неправильно?
Here is a link к этому коду на игровой площадке TypeScript.
Спасибо. Кажется, я понимаю, что вы имеете в виду. Но странно, что вы говорите, что это «не поддерживаемый случай использования», поскольку он явно упоминается (хотя и не реализован) в PR для этой функции в компиляторе https://github.com/Microsoft/TypeScript/pull/4910 –
Ну, этот PR был объединен более года назад, и прошло 6 месяцев с тех пор, как проблема, по которой они якобы хотят исправить этот вариант использования, была отмечена как «принятие PR».Я добавил слова о том, что этот вариант использования в настоящее время не поддерживается. Если бы они действительно хотели его поддержать, это было бы исправлено давно. – artem
Я представил альтернативный ответ, который включает в себя небезопасное обходное решение. –