【问题标题】:Why should I be using interfaces (models) in Typescript / Angular?为什么我应该在 Typescript / Angular 中使用接口(模型)?
【发布时间】:2018-11-20 18:36:57
【问题描述】:

在我看来,用模型定义对象似乎会使它们变得僵化且对更改的容忍度降低,从而使将来更容易破坏应用程序并添加代码行而无济于事。例如,我可以有一个从 API 返回视频对象的 get 方法,并将其编程为 Any 或定义的模型。

/model/video.ts

export interface Video {
// my code
 }

/pages/videos.ts

getAllVideos(): Promise<Video> {
// my code
}

对比

/pages/videos.ts

getAllVideos(): Promise<Any> {
// my code
}

我的看法。更少的代码行、更少的复杂性、更少的文件和更少的僵化是一件好事。为什么还要定义模型?

【问题讨论】:

    标签: angular typescript angular5 angular6


    【解决方案1】:

    在某些情况下,定义良好的接口更为重要。这取决于您要满足哪些要求、应用程序的风险等等。

    例如,在特定项目中,强制对该对象类型使用该方法可能更重要,从而降低错误概率。

    【讨论】:

      【解决方案2】:

      ...使将来更容易破解应用程序...

      这与使用 Typescript 向 JS 引入接口时发生的情况正好相反。

      假设您有一个函数可以接受具有特定形状的对象,就像这样

      function giveMeStuff(obj) {
        return obj.foo.toLowerCase();
      }
      

      在这种情况下,我们无法确保当我们调用giveMeStuff 时,我们实际上传递的是一个具有foo 属性的对象,该属性也必须是一个字符串。

      如果有新的开发人员(或您自己,几周后)出现并致电giveMeStuff(12),代码将在运行时中断。


      相反,当你有一个接口时会发生这种情况。

      function giveMeStuff(obj: IObjectWithFoo): string {
        return obj.foo.toLowerCase();
      }
      
      interface IObjectWithFoo {
        foo: string;
      }
      

      现在,当您尝试调用 giveMeStuff(12) 时,编译器会警告您不能这样做,因为函数需要不同类型的参数。

      【讨论】:

      • 我现在明白了。因此,我们将错误处理从运行时转移到编译器,并可能获得更好的错误消息。
      • 主要优点是能够在编译时捕获可预防的错误。
      • 我确实认为这是一项重大的劳动力投资(和应用程序复杂性),以换取将错误转移到编译时间。但是,我也看到它在具有大量开发人员和复杂部署的大型企业应用程序中非常有用。似乎对于小型应用程序而言,情况并非如此。
      • 好吧,请注意编译时的错误和运行时的错误之间的差异是巨大的。在第一种情况下,您将无法使用可能会中断的代码部署应用程序(这是一个非常理想的条件),在第二种情况下,您可以做任何您想做的事情,但应用程序可能会尽快崩溃当一些意想不到的事情发生时。
      猜你喜欢
      • 2020-02-13
      • 1970-01-01
      • 2016-10-05
      • 2019-12-14
      • 1970-01-01
      • 2020-01-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多