在 TypeScript 中,我可以从定义为从抽象 class 派生的 class(不是实例)的 属性 实例化吗?
In TypeScript, can I instantiate from a property defined as a class (not instance) derived from an abstract class?
简而言之,我想创建一个 class 来存储它将创建的类型(类似于工厂对象)。下面是我的问题的一个例子,适用于一组样本 classes:
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 代表我将要实例化的 class,但我想将其限制为从 Shape 派生的东西。当然我不能新建一个 Shape,但我不知道如何写出 shapeType 将从 Shape derived,但实际上不会 成为 抽象形状class。
我不确定是否可以使用类型保护来解释这将是一个具体的 class。也许还有另一种我根本没有考虑过的解决方法。我目前可能的解决方案是将 createShape 的 return 类型更改为任何类型,或者要求一个函数作为构造函数参数来代替 createShape.
尝试
shapeType: { new(): Shape; };
简而言之,我想创建一个 class 来存储它将创建的类型(类似于工厂对象)。下面是我的问题的一个例子,适用于一组样本 classes:
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 代表我将要实例化的 class,但我想将其限制为从 Shape 派生的东西。当然我不能新建一个 Shape,但我不知道如何写出 shapeType 将从 Shape derived,但实际上不会 成为 抽象形状class。
我不确定是否可以使用类型保护来解释这将是一个具体的 class。也许还有另一种我根本没有考虑过的解决方法。我目前可能的解决方案是将 createShape 的 return 类型更改为任何类型,或者要求一个函数作为构造函数参数来代替 createShape.
尝试
shapeType: { new(): Shape; };