类型'new()=> T'上不存在属性'parse'

时间:2019-07-31 14:08:26

标签: angular typescript tslint typescript3.0

我正在Angular中从事常规数据服务,它可以处理数据模型并与后端通信。

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

我以这种方式开始开发多功能服务:

这里是BaseModel,用于定义模型上最基本的内容,models/base_model/base.model.ts

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

这是一个用于定义数据集models/photoalbum/photoalbum.model.ts的相簿模型:

export class Photoalbum {
  id: number;
  public: boolean;
  name: string;

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

  prepareToSave() {
    return {
      // convert datas to backend
    }
  }
}

这里是用于与后端services/data/data.service.ts进行通信的DataService:

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

  // ...
}

现在我在DataService中收到此错误:

Property 'parse' does not exist on type 'new () => T'.

如果相关,我正在将TypeScript 3.5.2和tslint 5.9.1一起使用。

有什么办法解决吗?

1 个答案:

答案 0 :(得分: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');
  }
}