我最近看了一个关于使用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数据并绑定到接口/模型。有时我想要单个数据对象,有时我想保存对象的数组。

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


当前回答

当您只是想检查数据类型以确保响应始终具有必要的键时,请使用interface。类/模型不仅仅用于检查数据类型。另外,很高兴知道javascript中不存在接口,这意味着typescript将总是在编译时处理接口,不选择javascript原生的类。

其他回答

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

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);
      });
    });

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

当您只是想检查数据类型以确保响应始终具有必要的键时,请使用interface。类/模型不仅仅用于检查数据类型。另外,很高兴知道javascript中不存在接口,这意味着typescript将总是在编译时处理接口,不选择javascript原生的类。

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

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

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

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

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

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

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

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

来自Angular Style Guide

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