Class 获取变量的类型并创建此类型的新实例

Class 获取变量的类型并创建此类型的新实例,class,typescript,Class,Typescript,假设我有一个基类,其中包含一些属性dataItems,它是DataItem的数组: export class BaseClass{ dataItems:DataItems[]; } 然后我有几个扩展了基类的类,它们的dataItems属性是扩展dataItems的某个类的数组: export class BetterClass extends BaseClass{ dataItems:BetterDataItems[]; } export class BestClass exte

假设我有一个基类,其中包含一些属性dataItems,它是DataItem的数组:

export class BaseClass{
   dataItems:DataItems[];
}
然后我有几个扩展了基类的类,它们的dataItems属性是扩展dataItems的某个类的数组:

export class BetterClass extends BaseClass{
   dataItems:BetterDataItems[];
}

export class BestClass extends BaseClass{
   dataItems:BestDataItems[];
}
现在我想在基类中添加一个方法,该方法创建数据项并将它们添加到数组中。有可能在基类中完成所有这些吗?我需要创建BetterDataItems或BestDataItems的实例,具体取决于所使用的类

当时我只是补充说:

dataItemType: typeof DataItem; 
属性,并在扩展基类I的每个类中使用适当的数据项类型重写此变量:

在BetterClass中:

dataItemType: typeof BetterDataItem = BetterDataItem;
在班上:

dataItemType: typeof BestDataItem = BestDataItem;
然后,在基类中,我会这样做:

var dataItem = new this.dataItemType();
这很好,但我的问题是-是否可以完全避免使用
dataItemType
属性?我可以找到一种类型的
dataItems
数组并创建一个新实例吗


谢谢

选项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);
   }
}
type MyT=数据项的类型;
导出类GenericBaseClass{
数据项:T[];
构造函数(私有数据类型:MyT){
}
创建(){
this.dataItems.push(新建this.dataType())
}
}
导出类基类扩展了GenericBaseClass{
构造函数(){
超级(数据项);
}
}
导出类BetterClass扩展了GenericBaseClass{
构造函数(){
超级(BetterDataItem);
}
}
导出类BestClass扩展了GenericBaseClass{
构造函数(){
超级(最佳数据项);
}
}
类型脚本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编译器就是这样工作的。所以你的问题的答案是否定的



使用
dataItemType:typeof BetterDataItem=BetterDataItem的变通方法
之所以有效,是因为您让TypeScript编译器添加JS命令:
this.dataItemType=BetterDataItem以后可以使用。

+1;为了完整性起见,我认为可以在
基类
中使用
instanceof
操作符,但在这种情况下它实际上是一种反模式。(4.13类型断言)谢谢。所以我假设不可能简单地从变量中获取类的类型,然后创建一个类?instanceof需要检查每种类型,因此这并不是一个好的解决方案。