实例化通用对象时出现类型错误

TypeError while instanciating generic Object

我在尝试将 API-Data 转换为 Frontend-Dtos 时收到 TypeError: type is not a constructor

变换方法如下所示:

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();
  }
}

我从 here 中获取了解决方案。我在这里错过了什么?

DTO

import { Entity} from 'src/models/api/Entity';

export class EntityTableEntry {

  id: number;
  name: string;

  constructor(entity: Entity) {
    this.id = entity.ID;
    this.name = entity.Name;
  }
}

实体

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

我想要一个通用方法的原因是,我需要为每个 API-Call 重新编写转换方法,这完全是一团糟!

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

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);

Play