網站搜尋

angular - 屬性 'parse' 在類型 'new() => T' 上不存在


我正在使用 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。

有人知道怎麼解決這個問題嗎?

答案#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');
  }
}