【问题标题】:Property 'parse' does not exist on type 'new () => T'类型“new () => T”上不存在属性“parse”
【发布时间】:2019-12-09 02:11:19
【问题描述】:

我正在使用 Angular 开发通用数据服务,它可以处理数据模型并与后端通信。

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

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

这是 BaseModel 定义模型上最基本的东西,models/base_model/base.model.ts

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

这是一个用于定义数据集的 Photoalbum 模型,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
    }
  }
}

这里是与后端通信的DataService,services/data/data.service.ts

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。

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

【问题讨论】:

标签: angular typescript tslint typescript3.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');
  }
}

【讨论】:

  • 感谢您的帮助,我有一个问题。在这种情况下,也许我失去了概念的核心,不是吗?我不想使用 BaseModel 作为数据类型。我想将参数中的数据类型提供给服务。像这样的东西:constructor(dataService: DataService&lt;Photoalbum&gt;) { }
  • @netdjw 我明白了。我已经更新了我的答案。如果它仍然不是您想要的,请告诉我。
猜你喜欢
  • 2021-08-26
  • 2020-11-07
  • 2020-03-29
  • 1970-01-01
  • 1970-01-01
  • 2019-03-23
  • 2021-01-09
  • 2021-07-10
相关资源
最近更新 更多