为什么TypeScript无法正确传递强制转换的对象实例?

时间:2018-10-09 18:44:51

标签: javascript angular typescript observable

我一直在为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>;。为什么它不能这样工作?

1 个答案:

答案 0 :(得分:2)

当TypeScript转换为JavaScript时,所有键入信息都会丢失。 Typescript在开发期间非常有用,它会告诉您是否有任何错误,但是,如果来自服务器的数据与预期格式不匹配,则只有在您尝试访问不存在的属性时,它才会抱怨。

因此,每当您从后端接收数据时,如果不确定格式(或如果出现错误,则有可能返回另一种类型的对象),请务必对其进行验证。