打字稿中的抽象内部类

时间:2019-03-04 18:51:31

标签: javascript typescript ecmascript-6 polymorphism

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中是否有可能将一个类作为另一个子类的子类-并将其作为抽象属性(最好是静态的)。

2 个答案:

答案 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"); }
    }
}

并且代码将是安全类型。

Playground

------编辑------

如果您希望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"); }
    }
}

如果满足您的需求,那就太好了。如果不是,请编辑您的问题以包括有关您的用例的更多信息。希望对您有帮助。祝你好运!