Я думаю, что получил это.
В синтаксисе TS, как это attribute: Item { ...
означает, что attribute
является экземпляром класса Item
.Если вы хотите, чтобы attribute
был классом Item (не экземпляром), вы должны использовать синтаксис, подобный этому attribute: { new (...args): Item } {...
.Итоговый код должен выглядеть следующим образом:
abstract class ModelView<M extends Model> {}
abstract class Model {
public View: { new(...args): ModelView<Model> };
getView(): ModelView<Model> {
return new this.View();
}
}
, а затем в классе Shape
вы можете сделать это:
class Shape extends Model {
View = class {
constructor(){ console.log("view created"); }
}
}
И код будет безопасным для типа.
Детская площадка
------ Отредактировано ------
Если вы хотите, чтобы View был статичным и доступен только для чтения, вам нужно немного изменить getView
реализация к этому:
public static readonly View: { new(...args): ModelView<Model> };
getView(): ModelView<Model> {
return new Model.View();
}