我一直在为Angular Web应用实现功能。我们连接到各种API端点,这些端点返回JSON响应。这是此类请求的示例:
import { RecipesResponse } from '../../models/response/recipes';
getRecipes(): Observable<RecipesResponse> {
const url = `/recipes`;
return this.http.request('GET', url).pipe(
catchError(this.errorHandler.handleError)
) as Observable<RecipesResponse>;
}
可观察的“食谱响应”对象类定义如下:
export class RecipesResponse {
errors: string[];
recipes: string[];
constructor(args: any) {
if (!args) {
return null;
}
for (const field in args) {
if (args.hasOwnProperty(field)) {
this[field] = args[field];
}
}
}
}
这是来自Angular组件的请求逻辑:
getTheRecipes(): void {
this.recipeService.getRecipes().pipe(
takeUntil(this.unsubscribe)
).subscribe(
response => {
const recipesResponse = new RecipesResponse(response);
},
error => {
console.log(error);
}
);
}
这里的区别是response
正是服务器提供数据的方式,而recipesResponse
根据RecipesResponse
类格式化数据。但是,我希望response
将根据RecipesResponse
类进行格式化,因为getRecipes()
返回as Observable<RecipesResponse>;
。为什么它不能这样工作?
答案 0 :(得分:2)
当TypeScript转换为JavaScript时,所有键入信息都会丢失。 Typescript在开发期间非常有用,它会告诉您是否有任何错误,但是,如果来自服务器的数据与预期格式不匹配,则只有在您尝试访问不存在的属性时,它才会抱怨。
因此,每当您从后端接收数据时,如果不确定格式(或如果出现错误,则有可能返回另一种类型的对象),请务必对其进行验证。