场景
我知道从 API 调用返回的数据的形状,并且我希望它通过 TypeScript 类具有一些扩展功能。我已经知道我可以执行以下操作来满足此要求:
this.http
.get(url)
.map((res: Response) => {
return res.json().map((obj: Type) => {
return Object.assign(new Type(), obj);
});
})
// And so on
Run Code Online (Sandbox Code Playgroud)
是否可以进行类似于以下内容的通用实现:
get<T>(url: string): Observable<T> {
return this.http
.get(url)
.map((res: Response) => {
return res.json().map((obj: T) => {
return Object.assign(new T(), obj); // not sure how to approach this
});
});
}
Run Code Online (Sandbox Code Playgroud)
上面的代码适用于返回一个直接的 JavaScript 对象,但我不确定如何在泛型类型上运行分配。
我能够通过为新的泛型类型创建工厂类来使其工作。如果其他人可以提出更好的选择,我会将其标记为答案。
这就是我所做的:
factory.ts
export class Factory<T> {
constructor(private type: new () => T) { }
getNew(): T {
return new this.type();
}
}
Run Code Online (Sandbox Code Playgroud)
app.service.ts
@Injectable()
export class AppService {
users = new BehaviorSubject<User[]>([]);
constructor(public http: Http) { }
getUsers() {
const userFactory = new Factory<User>(User);
this.http.get('https://jsonplaceholder.typicode.com/users')
.map((res: Response) => this.extractGeneric<User>(res, userFactory))
.catch(this.handleError)
.subscribe(
data => this.users.next(data),
err => console.log(err)
)
}
extractGeneric<T>(res: Response, factory: Factory<T>) {
return res.json().map((obj: T) => {
return Object.assign(factory.getNew(), obj);
});
}
handleError(error: Response | any) {
let errMsg: string;
if (error instanceof Response) {
const body = error.json() || '';
const err = body.error || body.Message || JSON.stringify(body);
errMsg = `${err}`;
} else {
errMsg = error.message ? error.message : error.toString();
}
console.error(errMsg);
return Observable.throw(errMsg);
}
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
2301 次 |
| 最近记录: |