Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby-on-rails-4/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
为什么我要在Typescript/Angular中使用接口(模型)?_Angular_Typescript_Angular5_Angular6 - Fatal编程技术网

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

为什么我要在Typescript/Angular中使用接口(模型)?,angular,typescript,angular5,angular6,Angular,Typescript,Angular5,Angular6,在我看来,用模型定义对象似乎会使它们变得僵化、不那么容忍更改,从而更容易在将来破坏应用程序,并添加代码行而毫无收获。例如,我可以有一个get方法,它从API返回一个视频对象,并将其编程为任意或定义的模型 /model/video.ts export interface Video { // my code } /页面/视频.ts getAllVideos(): Promise<Video> { // my code } getAllVideos(): Promise<An

在我看来,用模型定义对象似乎会使它们变得僵化、不那么容忍更改,从而更容易在将来破坏应用程序,并添加代码行而毫无收获。例如,我可以有一个get方法,它从API返回一个视频对象,并将其编程为任意或定义的模型

/model/video.ts

export interface Video {
// my code
 }
/页面/视频.ts

getAllVideos(): Promise<Video> {
// my code
}
getAllVideos(): Promise<Any> {
// my code
}
getAllVideos():承诺{
//我的代码
}
vs

/页面/视频.ts

getAllVideos(): Promise<Video> {
// my code
}
getAllVideos(): Promise<Any> {
// my code
}
getAllVideos():承诺{
//我的代码
}
在我看来。更少的代码行、更少的复杂性、更少的文件和更少的刚性是一件好事。为什么还要定义模型

…使将来更容易中断应用程序

这与使用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)
时,编译器将警告您不能这样做,因为函数需要不同类型的参数。

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


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

我现在明白了。因此,我们正在将错误处理从运行时转移到编译器,并可能获得更好的错误消息。主要优势是能够在编译时捕获可预防的错误。我确实认为,将错误转移到编译时是一项巨大的人力投资(和应用程序复杂性)。不过,我也看到了它在拥有大量开发人员和复杂部署的大型企业应用程序上是多么有用。对于小型应用程序来说,情况似乎不是这样。好吧,请注意编译时错误和运行时错误之间的差异是巨大的。在第一种情况下,您无法使用可能会中断的代码部署应用程序(这是一种非常理想的情况),在第二种情况下,您可以做任何您想做的事情,但一旦发生意外情况,应用程序可能会崩溃。