我最近看了一个关于使用TypeScript的Angular 2教程,但不确定什么时候用接口,什么时候用模型来处理数据结构。

接口示例:

export interface IProduct {
    ProductNumber: number;
    ProductName: string;
    ProductDescription: string;
}

模型示例:

export class Product {
    constructor(
        public ProductNumber: number,
        public ProductName: string,
        public ProductDescription: string
    ){}
}

我想从URL加载JSON数据并绑定到接口/模型。有时我想要单个数据对象,有时我想保存对象的数组。

我应该使用哪一个,为什么?


当前回答

正如@ThierryTemplier所说,从服务器接收数据,并在组件之间传输模型(以保持智能感知列表并使设计时错误),使用接口是可以的,但我认为对于向服务器发送数据(DTO),最好使用类来利用从模型自动映射DTO的优势。

其他回答

接口只在编译时存在。这只允许您检查接收到的预期数据是否遵循特定的结构。为此,你可以将你的内容转换到这个接口:

this.http.get('...')
    .map(res => <Product[]>res.json());

请看这些问题:

如何将JSON对象转换为typescript类 如何获得日期对象从json响应在typescript

你可以对class做一些类似的事情,但与class的主要区别是它们是在运行时出现的(构造函数),你可以用processing在它们中定义方法。但是,在这种情况下,你需要实例化对象才能使用它们:

this.http.get('...')
    .map(res => {
      var data = res.json();
      return data.map(d => {
        return new Product(d.productNumber,
          d.productName, d.productDescription);
      });
    });

接口描述了类的契约或新类型。 它是一个纯Typescript元素,所以它不会影响Javascript。

一个模型,也就是一个类,是一个实际的用来生成新对象的JS函数。

我想从URL加载JSON数据并绑定到接口/模型。

选择一个模型,否则它在Javascript中仍然是JSON。

为了使代码更加灵活,我们需要使用接口。 创建接口并在类的构造函数中传递接口类型。它使用依赖注入。

好处:

如果接口的参数有变化,则不需要改变类。 2.为了进行测试,可以在类的构造函数中使用模拟数据。

使用类而不是接口,这是我在所有研究后发现的。

为什么?单独的类比类加接口的代码要少。(无论如何,你可能需要一个类的数据模型)

为什么?类可以充当接口(使用实现而不是扩展)。

为什么?在Angular依赖注入中,接口类可以是提供者查找令牌。

来自Angular Style Guide

基本上,一个类可以做接口能做的所有事情。所以可能永远不需要使用接口。

正如@ThierryTemplier所说,从服务器接收数据,并在组件之间传输模型(以保持智能感知列表并使设计时错误),使用接口是可以的,但我认为对于向服务器发送数据(DTO),最好使用类来利用从模型自动映射DTO的优势。