abstract class Model {
abstract class View extends ModelView<this>;
getView(){
return new View();
}
}
abtract class ModelView<M extends Model> {}
class Shape extends Model {
View = class {
constructor(){ console.log("view created"); }
}
}
我正在尝试实现这样的代码,我认为它们结构合理。
在react中是否有可能将一个类作为另一个子类的子类-并将其作为抽象属性(最好是静态的)。
答案 0 :(得分:2)
我想我明白了。
在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();
}
答案 1 :(得分:1)
您是否正在寻找类似以下的内容?
abstract class Model {
// don't use "class" here; the type of a constructor has new(...) in it:
abstract View: new () => ModelView<this>;
getView() {
return new this.View(); // View is an instance property, need "this"
}
}
abstract class ModelView<M extends Model> { }
class Shape extends Model {
View = class {
constructor(){ console.log("view created"); }
}
}
如果满足您的需求,那就太好了。如果不是,请编辑您的问题以包括有关您的用例的更多信息。希望对您有帮助。祝你好运!