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

zer*_*oin 8 class typescript

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

export class BaseClass{
   dataItems:DataItems[];
}
Run Code Online (Sandbox Code Playgroud)

然后我有几个扩展BaseClass的类,它们的dataItems属性是扩展DataItems的某个类的数组:

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

export class BestClass extends BaseClass{
   dataItems:BestDataItems[];
}
Run Code Online (Sandbox Code Playgroud)

现在我想在BaseClass中添加一个方法,它创建dataItems并将它们添加到数组中.是否可以在BaseClass中完成所有这些操作?我需要创建BetterDataItems或BestDataItems的实例,具体取决于使用的类.

目前我只是补充说:

dataItemType: typeof DataItem; 
Run Code Online (Sandbox Code Playgroud)

属性到BaseClass并在扩展BaseClass的每个类中使用适当的数据项类型覆盖此变量:

在BetterClass中:

dataItemType: typeof BetterDataItem = BetterDataItem;
Run Code Online (Sandbox Code Playgroud)

在BestClass:

dataItemType: typeof BestDataItem = BestDataItem;
Run Code Online (Sandbox Code Playgroud)

然后,在BaseClass中我这样做:

var dataItem = new this.dataItemType();
Run Code Online (Sandbox Code Playgroud)

这很好但我的问题是 - 是否可以避免拥有dataItemType财产?我可以找到一种类型的dataItems数组并创建一个新实例吗?

谢谢!

Mar*_*cka 4

TypeScript 1.6 代码:

class DataItems {

}

class BaseClass {
   dataItems:DataItems[];
   dataItemType: typeof DataItems = DataItems;
}
Run Code Online (Sandbox Code Playgroud)

编译为:

var DataItems = (function () {
    function DataItems() {
    }
    return DataItems;
})();
var BaseClass = (function () {
    function BaseClass() {
        this.dataItemType = DataItems;
    }
    return BaseClass;
})();
Run Code Online (Sandbox Code Playgroud)

您可以看到dataItems属性的类型信息在BaseClass. 这就是 TypeScript 编译器的工作原理。它不支持运行时检查。所以你的问题的答案是否定的。


你的解决方法dataItemType: typeof BetterDataItem = BetterDataItem;是有效的,因为你让 TypeScript 编译器添加 JS 命令: this.dataItemType = BetterDataItem;稍后可以使用。