angular 2将传入的api json映射到类对象数组的最佳方法

时间:2017-01-03 13:51:14

标签: json angular typescript

我正在使用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类对象..所以我不能进行类型检查。 还有其他办法吗?

1 个答案:

答案 0 :(得分:0)

确实你对这件事的看法是正确的。因为对象是由JSON.parse创建的,所以使用类来描述它们的形状是没有意义的。测试实例当然会失败,并导致误导性的API。

然而,有一个简单的解决方案。 Typescript有一个概念接口,用于描述各种API的形状,但没有运行时表现形式。这是接口而不是类的完美用例。请注意,typescript中的接口与Java等语言中的接口完全无关。

我知道我的建议与此时的官方风格指南相冲突。一般来说,它提出了一些很好的建议,但这个错误是错误的。不要使用类来描述通过JSON返回到远程服务的对象的形状。

如果您知道并信任为其提供服务的终点,您实际上不需要测试返回的对象的类型。您当前使用泛型声明响应类型的方法是一种很好的方法。只需使用界面而不是类。

您当然可以将特定对象与特定接口类型相关联。您可以根据服务器端序列化字段将其关联起来,以便在需要时可以选择,但您仍然不希望在客户端上使用该类。