在TypeScript中,我可以从定义为从抽象类派生的类(非实例)的属性中实例化吗?

时间:2016-09-30 18:55:06

标签: typescript abstract instantiation

简而言之,我想创建一个类来存储它将创建的类型(一种工厂对象)。下面是一个适用于一组示例类的问题示例:

abstract class Shape {
    size: number;
    abstract getArea(): number;
}

class Square extends Shape {
    getArea(): number { return this.size * this.size; }
}

class ShapeGenerator {
    shapeType: typeof Shape;
    createShape(): Shape { return new this.shapeType() }  // Here's the problem!
}

var squareGenerator = new ShapeGenerator();
squareGenerator.shapeType = Square;

var mySquare = squareGenerator.createShape();
mySquare.size = 5;
console.log(mySquare.getArea());

我希望shapeType表示我将要实例化的类,但我想将其限制为从Shape派生的东西。当然我不能新建一个Shape,但我无法弄清楚如何写出shapeType将从派生来自Shape,但实际上不会 抽象的Shape类。

我不确定是否可以使用类型防护来解释这将是一个具体的类。也许还有另一种解决方法,我根本没有考虑过。我目前可能的解决方案是将createShape的返回类型更改为any,或者需要一个函数作为构造函数参数来取代createShape。

1 个答案:

答案 0 :(得分:2)

尝试

shapeType: { new(): Shape; };