Typescript 实例化泛型对象时发生TypeError

Typescript 实例化泛型对象时发生TypeError,typescript,generics,typeerror,instantiation,Typescript,Generics,Typeerror,Instantiation,我得到一个TypeError:type在试图将API数据转换为前端dto时不是构造函数 变换方法如下所示: transform<T>(entities: any[]) { const tableDtos = new Array<T>(); for (const entity of entities) { const dto: T = this.factory.createEntity(entity); tableDtos.push(

我得到一个
TypeError:type在试图将API数据转换为前端dto时不是构造函数

变换方法如下所示:

transform<T>(entities: any[]) {
    const tableDtos = new Array<T>();
    for (const entity of entities) {
      const dto: T = this.factory.createEntity(entity);
      tableDtos.push(dto);
    }
    return tableDtos;
  }
export class Factory {
  create<T>(type: (new () => T)): T {
    return new type();
  }
}
实体

export interface Cost {
  ID: number;
  Name: string;
  Description: string;
  Value: number;
}

我想要一个通用方法的原因是,我需要为每个API调用重新编写转换方法,这是一个完全混乱的过程

我假设
实体
包含要创建的对象的数据。因此,不能使用
new
调用它。您希望传入要创建的实际类(可能会将数据分配给新实例):

xx类{
工厂:工厂=新工厂();
转换(类型:(new()=>T),实体:any[]{
const tableDtos=新数组();
for(实体的常量实体){
const dto:T=this.factory.createEntity(类型,实体);
表推(dto);
}
返回tablettos;
}
}
阶级工厂{
createEntity(类型:(new()=>T),数据:any:T{
var r=新类型();
assign(r,data)//在这里猜测一个合适的实现
返回r;
}
}
类数据类{a!:编号}
var r=new xx().transform(数据类,[{a:1}]);
控制台日志(r);

我假设
实体
包含要创建的对象的数据。因此,不能使用
new
调用它。您希望传入要创建的实际类(可能会将数据分配给新实例):

xx类{
工厂:工厂=新工厂();
转换(类型:(new()=>T),实体:any[]{
const tableDtos=新数组();
for(实体的常量实体){
const dto:T=this.factory.createEntity(类型,实体);
表推(dto);
}
返回tablettos;
}
}
阶级工厂{
createEntity(类型:(new()=>T),数据:any:T{
var r=新类型();
assign(r,data)//在这里猜测一个合适的实现
返回r;
}
}
类数据类{a!:编号}
var r=new xx().transform(数据类,[{a:1}]);
控制台日志(r);

实体
包含什么?您使用它的方式应该包含类(因此您将调用类似(
transform([Class1,Class2])
)。
实体包含什么?您使用它的方式应该包含类(因此您将调用类似(
transform([Class1,Class2])
)。谢谢-我认为这是解决我问题的方向。如果我使用此代码,它会给我以下错误:
类型为“typeof dtoClass”的参数不能分配给类型为“new”()的参数=>dtoClass'
我没有在Dto类中使用该方法-我在Angular Componente类中使用它来将传入的数据映射到更前端友好的Dto。我将把一个实体和Dto的示例类放入问题中。@FlixRo唯一的问题是
EntityTableEntry
有一个带参数的参数,您可以更新包含参数的构造函数签名:
new(p:any)=>T
谢谢:)很抱歉这个问题,但是参数到底应该放在哪里?如果我像这样将其放入create
createEntity(type:(new(p:any)=>T),数据:any)
错误继续显示。无需担心-我也忘了将其放入
transform
中。将createEntity简化为
静态createEntity(type:(new(p:any)=>T),data:any:T{return new type(data);}
非常感谢您的澄清!:)谢谢-我认为这是解决我问题的方向。如果我使用此代码,它会给我以下错误:
类型为“typeof dtoClass”的参数不能分配给类型为“new()=>dtoClass”的参数。
我没有在Dto类中使用该方法-我在Angle Componente类中使用它来将传入数据映射到更前端友好的Dto。我将在问题中加入一个实体和Dto的示例类。@FlixRo唯一的问题是
EntityTableEntry
有一个带参数的参数,您可以更新构造函数的签名以包含参数:
new(p:any)=>T
Thank:)对不起,这个问题很抱歉,但是参数应该放在哪里?如果我像这样将其放入create中
createEntity(type:(new(p:any)=>T),data:any)
则错误将继续显示。无需担心-我也忘了将其放入
transform
中。将createEntity简化为
静态createEntity(type:(new(p:any)=>T),data:any):T{returnnewtype(data);}
非常感谢您将其清理干净!:)
export interface Cost {
  ID: number;
  Name: string;
  Description: string;
  Value: number;
}
class xx {
  factory: Factory = new Factory();
  transform<T>(type: (new () => T), entities: any[]) {
    const tableDtos = new Array<T>();
    for (const entity of entities) {
      const dto: T = this.factory.createEntity(type, entity);
      tableDtos.push(dto);
    }
    return tableDtos;
  }
}

class Factory {
  createEntity<T>(type: (new () => T), data: any): T {
    var r = new type();
    Object.assign(r, data) // guessing a decent implementation here 
    return r;
  }
}

class DataClass { a!: number }

var r = new xx().transform(DataClass, [{ a: 1 }]);
console.log(r);