Angular 财产';解析';不存在于类型';新建()=>;T';

Angular 财产';解析';不存在于类型';新建()=>;T';,angular,typescript,tslint,typescript3.0,Angular,Typescript,Tslint,Typescript3.0,我正在开发一个通用数据服务,它可以处理数据模型并与后端进行通信 现在我有多个服务到每个API端点,相同的代码,只是模型类型(当然还有URI)不同 我开始以这种方式开发多用途服务: 下面是BaseModel来定义模型中最基本的东西,models/base\u model/base.model.ts: export class BaseModel { id: number; prepareToSave: () => void; static parse () { throw

我正在开发一个通用数据服务,它可以处理数据模型并与后端进行通信

现在我有多个服务到每个API端点,相同的代码,只是模型类型(当然还有URI)不同

我开始以这种方式开发多用途服务:

下面是BaseModel来定义模型中最基本的东西,
models/base\u model/base.model.ts

export class BaseModel {
  id: number;
  prepareToSave: () => void;
  static parse () {
    throw new Error('not implemented');
  }
}
export class Photoalbum {
  id: number;
  public: boolean;
  name: string;

  static parse(data: any) {
    return new this(data);
  }

  prepareToSave() {
    return {
      // convert datas to backend
    }
  }
}
export class DataService<T extends BaseModel> {
  constructor(
    private type: new () => T,
    private url: string,
    private http: HttpClient) { }

  getAll(): Promise<T[]> {
    return new Promise( resolve => {
      this.http.get(this.url).subscribe( (result: any) => {
        const data: T[] = [];
        result.forEach( (item: any) => {
          data.push(this.type.parse(item)); // error in this line
        });
        resolve(data);
      });
    });
  }

  // ...
}
下面是一个Photoalbum模型,用于定义数据集,
models/Photoalbum/Photoalbum.model.ts

export class BaseModel {
  id: number;
  prepareToSave: () => void;
  static parse () {
    throw new Error('not implemented');
  }
}
export class Photoalbum {
  id: number;
  public: boolean;
  name: string;

  static parse(data: any) {
    return new this(data);
  }

  prepareToSave() {
    return {
      // convert datas to backend
    }
  }
}
export class DataService<T extends BaseModel> {
  constructor(
    private type: new () => T,
    private url: string,
    private http: HttpClient) { }

  getAll(): Promise<T[]> {
    return new Promise( resolve => {
      this.http.get(this.url).subscribe( (result: any) => {
        const data: T[] = [];
        result.forEach( (item: any) => {
          data.push(this.type.parse(item)); // error in this line
        });
        resolve(data);
      });
    });
  }

  // ...
}
下面是与后端通信的数据服务,
services/data/data.service.ts

export class BaseModel {
  id: number;
  prepareToSave: () => void;
  static parse () {
    throw new Error('not implemented');
  }
}
export class Photoalbum {
  id: number;
  public: boolean;
  name: string;

  static parse(data: any) {
    return new this(data);
  }

  prepareToSave() {
    return {
      // convert datas to backend
    }
  }
}
export class DataService<T extends BaseModel> {
  constructor(
    private type: new () => T,
    private url: string,
    private http: HttpClient) { }

  getAll(): Promise<T[]> {
    return new Promise( resolve => {
      this.http.get(this.url).subscribe( (result: any) => {
        const data: T[] = [];
        result.forEach( (item: any) => {
          data.push(this.type.parse(item)); // error in this line
        });
        resolve(data);
      });
    });
  }

  // ...
}
如果相关的话,我将使用TypeScript 3.5.2和tslint 5.9.1


有没有办法解决这个问题?

嗯,
parse
只作为
BaseModel
的静态属性存在,因此收到错误也就不足为奇了。 更改构造函数中
type
的类型

  constructor(
    private type: { new (): T, parse(data: any): any },
    private url: string,
    private http: HttpClient) { }

然后更新parse方法的定义以接受一个参数

export class BaseModel {
  id: number;
  prepareToSave: () => void;
  static parse (item: any): any {
    throw new Error('not implemented');
  }
}

看看@netdjw,你有没有找到这个问题的答案?我面临着同样的问题,但没有找到解决方案:(谢谢你的帮助,我有一个问题。在这种情况下,我可能失去了概念的核心,不是吗?我不想使用
BaseModel
作为数据类型。我想将参数中的数据类型赋予服务。类似这样:
constructor(dataService:dataService){}
@netdjw我明白了。我已经更新了我的答案。如果仍然不是你想要的,请告诉我。