Ozz*_*zah 2 inheritance abstract-class typescript typescript2.6
我正在用 TypeScript 2.6 编写一些图形代码,但在继承和通用代码方面我有一个小障碍:
abstract class Series { /**/ }
class LineSeries extends Series { /**/ }
class BarSeries extends Series { /**/ }
class ScatterSeries extends Series { /**/ }
class Chart {
private seriesArray: Series[] = [];
constructor(series: Series[]) {
let seriesType: typeof Series = null;
switch (series.SeriesType) {
case SeriesType.LineSeries:
seriesType = LineSeries;
break;
case SeriesType.BarSeries:
seriesType = BarSeries;
break;
case SeriesType.ScatterSeries:
seriesType = ScatterSeries;
break;
default:
throw "Unsupported series type";
}
for (let i = 0; i < series.length; i++)
this.SeriesArray.push(new seriesType());
}
}
Run Code Online (Sandbox Code Playgroud)
我打算用上面的代码构造一个派生自 的新对象Series,其中最后一行的构造函数来自运行时分配的类型值。我的问题是它Series是抽象的,所以我无法实例化它,但是我永远不会将值分配typeof Series给series变量。(但 TypeScript 不知道)。
我已经想到了一些解决方案,但没有一个是特别优雅的。一种方法是简单地删除abstract修饰符Series并选择性地放入一些代码以在实例化时抛出异常。另一种解决方案是将定义更改seriesType为:
let seriesType: (typeof LineSeries | typeof BarSeries | typeof ScatterSeries) = null;
Run Code Online (Sandbox Code Playgroud)
但是每次添加新类型的系列时,我都需要维护此列表。我知道我可以做到,例如:
type DerivedSeries = (typeof LineSeries | typeof BarSeries | typeof ScatterSeries);
Run Code Online (Sandbox Code Playgroud)
进而
let seriesType: DerivedSeries = null;
Run Code Online (Sandbox Code Playgroud)
但这并没有太大的改进,如果有的话。
有没有更优雅的方法可以告诉 TypeScriptseriesType是 type Series,但也必须是可实例化的子类型?即表达式seriesType = Series;应该抛出一个编译时错误,而不是new seriesType();.
谢谢
实例化从抽象类派生的类的最简单方法是使用以下new()方法定义对象类型:
abstract class AbstractClass { /**/ }
class DerivedClassA extends AbstractClass { /**/ }
class DerivedClassB extends AbstractClass { /**/ }
const classCtors: Array<{ new(): AbstractClass }> = [
DerivedClassA,
DerivedClassB
];
for (const ctor of classCtors) {
const instance = new ctor();
}
Run Code Online (Sandbox Code Playgroud)