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

时间:2015-10-13 06:40:33

标签: class typescript

假设我有一个带有一些属性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数组并创建一个新实例吗?

谢谢!

2 个答案:

答案 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;,可以在以后使用。