如何在typescript中创建带有参数的<t>实例?

时间:2017-10-19 14:44:45

标签: typescript generics templating

我有一个泛型类,需要创建一个带有一些参数的实例。我找到了如何使用空构造函数创建实例,但是当我尝试重载它时,我得到一个错误:&#39;错误TypeError:rowObj不是构造函数&#39;

以下是可行的旧代码(但使用空构造函数):

export class DataTableViewModel<TRow extends DataTableRowViewModel> {
public rowsViewModel: TRow[];
public totalItemsCount: number;

constructor(dateService: DateService, rows?: any[]) {
    this.rowsViewModel = [];
    if (rows) {
        rows.forEach((row) => {
            let obj = Object.getPrototypeOf(Object.create(row) as TRow);
            this.rowsViewModel.push(obj);
        });
    }
}
}

以下是我正在尝试的新代码:

export abstract class DataTableViewModel<TRow extends DataTableRowViewModel> {
public rowsViewModel: TRow[];
public totalItemsCount: number;

constructor(dateService: DateService, rows?: { new(): any }[]) {
    this.rowsViewModel = [];
    if (rows) {
        let rowObj: { new(dateService: DateService, rows?: any): TRow };
        rows.forEach((row) => {
            let obj = new rowObj(dateService, row);
            this.rowsViewModel.push(obj);
        });
    }
}
}

1 个答案:

答案 0 :(得分:1)

您已声明变量rowObj,但尚未对其进行初始化。您需要为其分配一个构造函数,并且您必须安排从某个地方获取该构造函数。

您不能只创建一个TRow对象:该名称仅存在于编译时类型空间中,它在运行时不存在。在某个地方,您必须拥有一个可以调用的具体对象。例如,您可以将其作为另一个参数添加到构造函数中:

export abstract class DataTableViewModel<TRow extends DataTableRowViewModel> {
    public rowsViewModel: TRow[];
    public totalItemsCount: number;

    constructor(rowObj: { new(dateService: DateService, rows?: any): TRow },
     dateService: DateService, rows?: { new(): any }[]) {
        this.rowsViewModel = [];
        if (rows) {
            rows.forEach((row) => {
                let obj = new rowObj(dateService, row);
                this.rowsViewModel.push(obj);
            });
        }
    }
}