Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/angular/30.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
angular 2将传入api json映射到类对象数组的最佳方法_Json_Angular_Typescript - Fatal编程技术网

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

angular 2将传入api json映射到类对象数组的最佳方法,json,angular,typescript,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 { Requ

我在和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);
  }
}
从'@angular/core'导入{Injectable};
从'@angular/Http'导入{RequestOptions,urlsearchparms,QueryEncoder,Http,Headers,Response};
从“/Trip”导入{Trip};
从“rxjs/Observable”导入{Observable};
进口“rxjs/Rx”;
@可注射()
出口类图书服务{
构造函数(私有http:http){}
fetchbooks():可观察{
返回this.http.get('some\u url')
.map((res:Response)=>res.json().books);
}
}
但是

取书()

不会将传入的json映射到book类对象。。所以我不能做打字检查。
还有别的办法吗???

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

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

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

如果您知道并信任为它们服务的端点,那么实际上不需要测试返回的对象的类型。您当前使用泛型断言响应类型的方法是一种很好的方法。只需使用接口而不是类


当然,您可以将特定对象与特定接口类型相关联。您可以基于服务器端序列化字段将其关联起来,这样您就可以选择是否需要关联,但您仍然不希望在客户端上使用类来关联。确实,您对这一问题的想法是正确的。因为对象是由JSON.parse创建的,所以使用类来描述它们的形状是毫无意义的。测试实例当然会失败,并导致产生误导性的API

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

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

如果您知道并信任为它们服务的端点,那么实际上不需要测试返回的对象的类型。您当前使用泛型断言响应类型的方法是一种很好的方法。只需使用接口而不是类


当然,您可以将特定对象与特定接口类型相关联。您可以基于服务器端序列化字段将其关联起来,这样您就可以选择是否需要关联,但您仍然不希望在客户端上使用此类。

非常感谢您的回复。我决定使用class的原因是,为了指定strictNullChecks,在将api json数据映射到class对象之后,我可以将class对象用于应用程序中的其他操作。我还希望运行时类型强制转换检查
strictNullChecks
非常棒。它们与类无关,同样适用于接口如果服务器由于两个原因发送错误对象,这不会导致任何错误。在编译时,transpiler不知道服务器将发送什么。在运行时,所有类型信息都被删除,因为所有内容都被编译为javascript。因此,如何进行结构和类型检查?使用类不会自动验证。如果要验证响应的结构,则需要编写验证逻辑。在这种情况下,您可以在接受JSON响应的构造函数或工厂函数中执行此操作。“那么如何执行结构和类型检查?”这是不可能的。类的类型就像接口一样被删除。非常感谢您的回复。我决定使用class的原因是,为了指定strictNullChecks,在将api json数据映射到class对象之后,我可以将class对象用于应用程序中的其他操作。我还希望运行时类型强制转换检查
strictNullChecks
非常棒。它们与类无关,同样适用于接口如果服务器由于两个原因发送错误对象,这不会导致任何错误。在编译时,transpiler不知道服务器将发送什么。在运行时,所有类型信息都被删除,因为所有内容都被编译为javascript。因此,如何进行结构和类型检查?使用类不会自动验证。如果要验证响应的结构,则需要编写验证逻辑。在这种情况下,您可以在接受JSON响应的构造函数或工厂函数中执行此操作。“那么如何执行结构和类型检查?”这是不可能的。类的类型就像接口一样被擦除。