【发布时间】:2018-06-26 23:19:45
【问题描述】:
我正在使用 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());
}
}
我希望上面的代码构造一个派生自Series 的新对象,其中最后一行的构造函数来自运行时分配的类型值。我遇到的问题是Series 是抽象的,所以我无法实例化它,但是我永远不会将值typeof Series 分配给series 变量。 (但 TypeScript 不知道这一点)。
我已经想到了一些解决方案,但没有一个是特别优雅的。一种是简单地从Series 中删除abstract 修饰符,并可选地放入一些代码以在实例化时抛出异常。另一种解决方法是将seriesType的定义改为:
let seriesType: (typeof LineSeries | typeof BarSeries | typeof ScatterSeries) = null;
但是每次添加新类型的系列时,我都需要维护此列表。我知道我可以做到,例如:
type DerivedSeries = (typeof LineSeries | typeof BarSeries | typeof ScatterSeries);
然后
let seriesType: DerivedSeries = null;
但这并没有太大的改进,如果有的话。
有没有更优雅的方法可以告诉 TypeScript seriesType 是 Series 类型,但也必须是可实例化的子类型?即表达式 seriesType = Series; 应该抛出编译时错误,而不是 new seriesType();。
谢谢
【问题讨论】:
标签: typescript inheritance abstract-class typescript2.6