我为什么要在Typescript/Angular中使用接口(模型)?

tsh*_*001 2 typescript angular angular5 angular6

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

/model/video.ts

export interface Video {
// my code
 }
Run Code Online (Sandbox Code Playgroud)

/pages/videos.ts

getAllVideos(): Promise<Video> {
// my code
}
Run Code Online (Sandbox Code Playgroud)

/pages/videos.ts

getAllVideos(): Promise<Any> {
// my code
}
Run Code Online (Sandbox Code Playgroud)

我看待它的方式.更少的代码行,更少的复杂性,更少的文件和更少的刚性是一件好事.为什么要定义模型?

bug*_*ugs 8

...让以后更容易破解应用程序......

这与使用Typescript向JS引入接口时发生的情况完全相反.

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

function giveMeStuff(obj) {
  return obj.foo.toLowerCase();
}
Run Code Online (Sandbox Code Playgroud)

在这种情况下,我们没有办法,以确保当我们调用giveMeStuff我们实际上是通过其拥有的对象foo属性,它也需要一个字符串.

如果一个新的开发人员(或者你自己,几个星期后)出现并调用giveMeStuff(12),代码将在运行时中断.


相反,这是当你有一个接口时会发生的事情.

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

interface IObjectWithFoo {
  foo: string;
}
Run Code Online (Sandbox Code Playgroud)

现在,当你试图调用时giveMeStuff(12),编译器会警告你不能这样做,因为函数期望一种不同的参数.

  • 我现在明白了。因此,我们正在将错误处理从运行时转移到编译器,并可能获得更好的错误消息。 (2认同)
  • 好吧,请注意编译时的错误和运行时的错误之间的差异是巨大的。在第一种情况下,您将无法使用可能会中断的代码(这是非常理想的情况)部署应用程序,在第二种情况下,您可以做任何想做的事情,但应用程序可能很快就会崩溃当一些意想不到的事情发生时。 (2认同)