何时在TypeScript / Angular2中使用接口和模型


197

我最近观看了带有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数据并绑定到接口/模型。有时我想要一个数据对象,而其他时候我想要保留对象和数组。

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


13
需要自定义逻辑init时使用类,否则请始终使用接口,因为仅在编译时可用。Typescript接口未编译为javascript,因为它在javascript中不存在。
Dieterg '16

6
请记住,在Angular 2中,接口将不能与依赖项注入一起使用。在这里,您将不得不使用类。
jlang

Answers:


137

接口仅在编译时。这仅允许您检查接收到的预期数据是否遵循特定的结构。为此,您可以将内容投射到此界面:

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

看到以下问题:

您可以对类进行类似的操作,但是与类的主要区别在于它们在运行时存在(构造函数),并且可以通过处理在其中定义方法。但是,在这种情况下,您需要实例化对象才能使用它们:

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

27
感谢您的详细回答。如果仅在编译时使用该接口,则编译器如何在不实际检查http get的情况下检查JSON文件的结构?如果不能,那么即使打扰接口又有什么意义呢?
I_LIKE_FOO

7
@I_LIKE_FOO编译器不需要检查get调用。它只关心检查它知道的类型以及它们是否正确对齐。对于编译器var data = res.json();来说确实var data: any = res.json();如此,因此我们将丢失所有类型检查data。什么会比较有用这里会像var data: ProductDto[] = res.json();ProductDto作为一个接口,车型在返回的JSON数据结构。
GFoley83 '17

3
更多信息:Angular style guide says not to use interfaces.Always use classes.请参见angular.io/guide/styleguide#style-03-03
萨姆帕斯

4
是的,但问题是他们不是设计Typescript的大师。那将是微软和公司。他们倾向于使用接口和适当的类。还有加分...一个是运行时,另一个是在编译时
Tom Stickel

11
@Sampath也许Angular样式指南已更新,因为我现在看到此“考虑将接口用于数据模型”。暗示数据模型更喜欢使用接口而不是类。
Mikezx6r

40

接口描述了无论是对一个合同或新类型。它是一个纯Typescript元素,因此不会影响Javascript。

模型(即)是实际的JS函数,用于生成新对象。

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

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


4

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


-22

经过我所有的研究,我发现使用类而不是接口

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

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

为什么?接口类可以是Angular依赖项注入中的提供程序查找令牌。

来自Angular Style Guide

基本上,一个类可以完成所有工作,而接口可以完成所有工作。因此可能永远不需要使用Interface


10
目前,《 Angular Style Guide》说:“ 考虑对数据模型使用接口
Alex Peters

@AlexPeters请提供任何真实的链接。在此先感谢
Anand Phadke

@AnandPhadke可以肯定的是,这是我在上面发表评论时所写的Angular Style Guide 的Wayback Machine链接
Alex Peters
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.