Angular 为什么要在ionic 3中创建视图模型?

Angular 为什么要在ionic 3中创建视图模型?,angular,typescript,ionic3,Angular,Typescript,Ionic3,嗯,我不知道我的模型是否有问题,或者只是我理解得不够好,我正在用ionic 3创建应用程序,其中我正在为来自我使用的api的数据创建视图模型 假设我有一个get请求,它获取一个项目列表,我有一个类似这样的项目接口 export interface Item{ item_ID:number; item_Name:string; } 有一个api可以获取上述格式的项目,订阅get请求将返回我上面显示的项目对象中的数据,我可以正常访问属性,但我得不到的是,如果我更改api中的返回数据

嗯,我不知道我的模型是否有问题,或者只是我理解得不够好,我正在用ionic 3创建应用程序,其中我正在为来自我使用的api的数据创建视图模型

假设我有一个get请求,它获取一个项目列表,我有一个类似这样的项目接口

export interface Item{
    item_ID:number;
    item_Name:string;
}
有一个api可以获取上述格式的项目,订阅get请求将返回我上面显示的项目对象中的数据,我可以正常访问属性,但我得不到的是,如果我更改api中的返回数据,例如,将item_price添加到从api返回的json中,并将返回的数据分配给接口对象,不管我的定义如何,都只会将属性添加到接口对象中,我在这里做错了什么吗?还是我遗漏了什么


提前谢谢

TypeScript只在编译时增加了类型安全性以及类型检查时间。基本上,如果你这样做的话

const a: string = 1 + 2
TypeScript将向您发出尖叫,但它仍将生成以下有效JavaScript:

const a = 1 + 2
浏览器会很高兴地将3分配给a—它不在乎,甚至知道您在TypeScript代码中声明为字符串。您的浏览器看到的唯一东西是JavaScript,并且无法在JavaScript中定义静态类型,因为它是一种松散类型的语言

在您的示例中,您尝试将响应的外观教给TypeScript,因此您说它将有item_ID和item_Name。但是当TypeScript被编译成JavaScript时,这些信息将丢失——JavaScript将接受任何类型的对象,而不关心您在TypeScript中使用了什么接口

换句话说,这样做:

const respose: MyInterface = await fetch('data').somehow()

这意味着您确信API端点将返回MyInterface的形状-如果不返回,则TypeScript无法帮助您。因此,如果API不返回MyInterface,而是返回其他内容,则代码中不会有任何更改。当您将返回的值记录在console.log中时,您将看到API返回的内容,而不是通过接口指定的内容。

该接口有助于在TypeScript中实现类型安全。它不会改变数据对象的形状以匹配接口。@DanielWStrimpel从您所说的我得到的是,我应该将其定义为类而不是接口?我在学习一门教授爱奥尼亚的课程,这是它创建视图模型的方式,我不懂,所以我问了这个问题。谢谢你的帮助!第4点-关于为数据模型而不是类使用接口的建议。@EssamEid如果您不想保留从服务返回的对象的所有属性,最好使用RxJS映射操作符将对象变异为您想要的形状。类与接口不会改变您的行为。