我正在使用Angular 2.我正在尝试找出将传入的json对象映射到类数组的正确方法
./ book.ts
export class book{
constructor(
public id: number,
public title: string,
public publication_date: string){}
}
./ book.service.ts
import { Injectable } from '@angular/core';
import { RequestOptions, URLSearchParams, QueryEncoder, Http, Headers, Response } from '@angular/http';
import { Trip } from './trip';
import {Observable} from 'rxjs/Observable';
import 'rxjs/Rx';
@Injectable()
export class BookService {
constructor(private http: Http) { }
fetchbooks(): Observable<book[]>{
return this.http.get('some_url')
.map((res: Response) => <book[]>res.json().books);
}
}
但是
fetchbooks()
没有将传入的json映射到book类对象..所以我不能进行类型检查。 还有其他办法吗?
答案 0 :(得分:0)
确实你对这件事的看法是正确的。因为对象是由JSON.parse创建的,所以使用类来描述它们的形状是没有意义的。测试实例当然会失败,并导致误导性的API。
然而,有一个简单的解决方案。 Typescript有一个概念接口,用于描述各种API的形状,但没有运行时表现形式。这是接口而不是类的完美用例。请注意,typescript中的接口与Java等语言中的接口完全无关。
我知道我的建议与此时的官方风格指南相冲突。一般来说,它提出了一些很好的建议,但这个错误是错误的。不要使用类来描述通过JSON返回到远程服务的对象的形状。
如果您知道并信任为其提供服务的终点,您实际上不需要测试返回的对象的类型。您当前使用泛型声明响应类型的方法是一种很好的方法。只需使用界面而不是类。
您当然可以将特定对象与特定接口类型相关联。您可以根据服务器端序列化字段将其关联起来,以便在需要时可以选择,但您仍然不希望在客户端上使用该类。