我正在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一起使用。
有什么办法解决吗?
答案 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');
}
}