假设我有一个带有一些属性dataItems的基类,它是DataItem的数组:
export class BaseClass{
dataItems:DataItems[];
}
然后我有几个扩展BaseClass的类,它们的dataItems属性是一个扩展DataItems的类的数组:
export class BetterClass extends BaseClass{
dataItems:BetterDataItems[];
}
export class BestClass extends BaseClass{
dataItems:BestDataItems[];
}
现在我想在BaseClass中添加一个方法,它创建dataItems并将它们添加到数组中。是否可以在BaseClass中完成所有这些操作?我需要创建BetterDataItems或BestDataItems的实例,具体取决于使用的类。
目前我只是添加:
dataItemType: typeof DataItem;
属性到BaseClass并且在扩展BaseClass的每个类中,我用适当的数据项类型覆盖这个变量:
在BetterClass中:
dataItemType: typeof BetterDataItem = BetterDataItem;
在BestClass中:
dataItemType: typeof BestDataItem = BestDataItem;
然后,在BaseClass中我这样做:
var dataItem = new this.dataItemType();
这很好但我的问题是 - 是否可以避免拥有dataItemType
属性?我可以找到一种dataItems
数组并创建一个新实例吗?
谢谢!
答案 0 :(得分:4)
选项1:您可以覆盖每个子类中的方法......
export class BaseClass{
dataItems:DataItem[];
create() {
this.dataItems.push(new DataItem());
}
}
export class BetterClass extends BaseClass{
dataItems:BetterDataItem[];
create() {
this.dataItems.push(new BetterDataItem());
}
}
export class BestClass extends BaseClass{
dataItems:BestDataItem[];
create() {
this.dataItems.push(new BestDataItem());
}
}
选项2:但是如果引入通用基类,则可以不需要在每个类上定义dataItems属性,也可以创建不同的实例。
type MyT = typeof DataItem;
export class GenericBaseClass<T extends DataItem> {
dataItems:T[];
constructor(private dataType: MyT) {
}
create() {
this.dataItems.push(<T>new this.dataType())
}
}
export class BaseClass extends GenericBaseClass<DataItem> {
constructor() {
super(DataItem);
}
}
export class BetterClass extends GenericBaseClass<DataItem> {
constructor() {
super(BetterDataItem);
}
}
export class BestClass extends GenericBaseClass<DataItem> {
constructor() {
super(BestDataItem);
}
}
答案 1 :(得分:4)
TypeScript 1.6代码:
class DataItems {
}
class BaseClass {
dataItems:DataItems[];
dataItemType: typeof DataItems = DataItems;
}
汇编为:
var DataItems = (function () {
function DataItems() {
}
return DataItems;
})();
var BaseClass = (function () {
function BaseClass() {
this.dataItemType = DataItems;
}
return BaseClass;
})();
您可以在dataItems
中看到BaseClass
属性的类型信息丢失。这就是TypeScript编译器的工作原理。 It does not support runtime checking。所以回答你的问题是否定的。
使用dataItemType: typeof BetterDataItem = BetterDataItem;
的解决方法有效,因为您使TypeScript编译器添加了JS命令:this.dataItemType = BetterDataItem;
,可以在以后使用。