Проблема
У меня есть абстрактный класс Model
:
abstract class Model{
static find(id: number) {
const instance = this.newInstance();
// ...
return instance;
}
static newInstance() {
return new this;
}
}
Конечно, мы получаем ошибку машинописного текста, говорящую Cannot create an instance of an abstract class
.И мы можем решить эту проблему путем переопределения this
метода newInstance
:
abstract class Model{
// ...
static newInstance(this: new() => Model) {
return new this;
}
}
Но тогда проблема возникает в методе find
: The 'this' context of type 'typeof Model' is not assignable to method's 'this' of type 'new () => Model'.
Cannot assign an abstract constructor type to a non-abstract constructor type.
Переопределениеthis
метода find
, как в методе newInstance
, не будет работать, потому что мы получим Property 'newInstance' does not exist on type 'new () => Model'.
Мое решение
Единственное решениеЯ мог найти добавление нового метода экземпляра в объявлении типа this
:
abstract class Model {
static find(this: {new: () => Model, newInstance: () => Model}, id: number) {
// ...
}
// ...
}
Но это не очень практично, потому что в классе Model
будет много статических методов.
Мой вопрос:
Как я могу вызвать статический класс, который создает экземпляр дочернего объекта из другого статического класса (в основном решение ошибок в приведенном выше коде)