可以说我有一个带有一些属性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数组类型然后创建一个新实例吗?

谢谢!

最佳答案

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

关于class - 获取变量的类型并创建此类型的新实例,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/33095813/

10-14 02:00