Typescript - 使用Array <t>,如何动态确定和创建T的新实例?

时间:2017-02-08 21:55:49

标签: arrays angular typescript

我有一堆不同对象的类型化数组。我想编写一个函数,只要该类型具有空构造函数,就可以向数组添加一个新的空白对象,该数组将与任何数组一起使用。

我是Angular 2和Typescript的新手。数组是表单的一部分,我希望能够添加一个新的行/对象,但是我有很多数组,并且会欣赏所有数组的通用函数。

regexprep('min(Current_em)', '.*\($0)', '$0')

instanceOf 来确定对象是否是某个类。但是,我还没有找到一种方法来访问作为Array对象的类型。

我可以使用下面的代码但有时数组可能是空的,这不会起作用 - 但它仍然会被输入,所以理论上我们仍然可以创建它。

someObject {
    constructor() { this.someField = ""; ... }
    someField: string;
    ...

}

someOtherObject {
    constructor() { this.someOtherField = ""; ... }
    someOtherField: string;
    ...
}

Array<someObject> someArray = someObject[{...}, {...} ...];
Array<someOtherObject> someOtherArray = someOtherObject[{...}, {...} ...];


// What I would like, that would work with either above array
// new T() obviously doesn't work however

addRow<T>(array:Array<T>) : void {
    array.push(new T());
}

有没有更好的方法来实现我想要的,或者我不知道的方法?谢谢。

编辑:正如Alexander所说,您可以使用

在Typescript中动态执行此操作
if(array.length > 0 && array[0] instanceOf(someObject)) { 
    array.push(new someObject()); 
} 
// else if instance of someOtherObject... so on so forth

在HTML 中使用时,这不起作用 例如由于HTML不了解someObject类定义,因此addRow<T>(array:Array<T>, c: {new(): T}) : void { array.push(new c()); } addRow(someArray, someObject); addRow(someOtherArray, someOtherObject); 无效

1 个答案:

答案 0 :(得分:1)

根据https://www.typescriptlang.org/docs/handbook/generics.html(参见“在泛型中使用类类型”),您可以做的最好的是:

class someObject {
    constructor() { this.someField = ""; }
    someField: string;
}

class someOtherObject {
    constructor() { this.someOtherField = ""; }
    someOtherField: string;
}

var someArray: Array<someObject> = [];
var someOtherArray: Array<someOtherObject> = [];

function addRow<T>(array: Array<T>, c: {new(): T}) : void {
    array.push(new c());
}

addRow(someArray, someObject);
addRow(someOtherArray, someOtherObject);

这是因为您必须将构造函数作为参数传递,以便能够创建它的实例。通用声明仅供编译器执行类型检查,并且在传递构造函数时不会产生实际代码。