如何使用打字稿中的参数创建 <T> 的实例?
How to create an instance of <T> with arguments in typescript?
我有一个通用的 class 并且需要创建一个带有一些参数的实例。我找到了如何使用空构造函数创建实例,但是当我尝试重载它时出现错误:'ERROR TypeError: rowObj is not a constructor'
这是有效的旧代码(但构造函数为空):
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);
});
}
}
}
您已经声明了一个变量 rowObj
但您还没有初始化它。您将需要为其分配一个构造函数,并且您必须安排从某个地方获取该构造函数。
您不能只创建一个 TRow
对象:该名称仅存在于编译时类型 space 中,它在运行时不存在。在某个地方,您必须有一个可以调用的具体对象。例如,您可以将它作为另一个参数添加到构造函数中:
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);
});
}
}
}
我有一个通用的 class 并且需要创建一个带有一些参数的实例。我找到了如何使用空构造函数创建实例,但是当我尝试重载它时出现错误:'ERROR TypeError: rowObj is not a constructor'
这是有效的旧代码(但构造函数为空):
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);
});
}
}
}
您已经声明了一个变量 rowObj
但您还没有初始化它。您将需要为其分配一个构造函数,并且您必须安排从某个地方获取该构造函数。
您不能只创建一个 TRow
对象:该名称仅存在于编译时类型 space 中,它在运行时不存在。在某个地方,您必须有一个可以调用的具体对象。例如,您可以将它作为另一个参数添加到构造函数中:
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);
});
}
}
}