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
谢谢:)很抱歉这个问题,但是参数到底应该放在哪里?如果我像这样将其放入createcreateEntity(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);