В нашей кодовой базе мы довольно широко используем шаблоны навигатора и построителя, чтобы абстрагироваться от сборки иерархических объектов.В основе этого лежит класс Navigator
, который мы используем для обхода различных классов.В настоящее время я пытаюсь перенести это в машинописный текст, но изо всех сил пытаюсь набрать его, чтобы использовать возможности машинописного текста.
Я думаю, что суть моей проблемы в том, что я не могу использовать this
в качестве значения по умолчанию для универсального объекта в классе, например, class Something<T = this>
, или что я не могу перегрузить класс, чтобы каким-либо образом обусловить егоустановить типы свойств класса.Можете ли вы рассказать, как я могу набрать Navigator
(и классы строителей) ниже?
// I guess what I'd like to do is
// class Navigator<BackT = this> but that's not allowed
class Navigator<BackT> {
// It's this 'back' type I'll like to define more specifically
// i.e. if back is passed to the constructor then it should be 'BackT'
// if back is not passed to the constructor or is undefined, it
// should be 'this'
back: BackT | this;
constructor(back?: BackT) {
this.back = back || this;
}
}
class Builder1<BackT> extends Navigator<BackT> {
builder1DoSomething() {
// Do some work here
return this;
}
}
class Builder2<BackT> extends Navigator<BackT> {
withBuilder1() {
return new Builder1(this);
// Also tried the following, but I got the same error:
// return new Builder1<this>(this);
}
builder2DoSomething() {
// Do some work here
return this;
}
}
// This is fine
new Builder1().builder1DoSomething().builder1DoSomething();
new Builder2()
.withBuilder1()
.builder1DoSomething()
// I get an error here becuase my types are not specific enough to
// let the complier know 'back' has taken me out of 'Builder1' and
// back to 'Builder2'
.back.builder2DoSomething();
ссылка на игровую площадку