为什么我应该在 Typescript / Angular 中使用接口(模型)?
Why should I be using interfaces (models) in Typescript / Angular?
在我看来,用模型定义对象似乎使它们变得僵化并且对更改的容忍度降低,这使得将来更容易破坏应用程序并添加代码行而无益。例如,我可以有一个 get 方法,该方法 returns 来自 API 的视频对象并将其编程为 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
}
我的看法。更少的代码行、更少的复杂性、更少的文件和更少的刚性是一件好事。为什么还要定义模型?
...making it easier to break an application in the future...
这与使用 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)
时,编译器会警告您不能这样做,因为该函数需要不同类型的参数。
在某些情况下,拥有定义良好的接口更为重要。这取决于您要满足的要求,应用程序的风险等。
例如,在特定项目中,强制对该对象类型使用该方法可能更重要,从而减少错误概率。
在我看来,用模型定义对象似乎使它们变得僵化并且对更改的容忍度降低,这使得将来更容易破坏应用程序并添加代码行而无益。例如,我可以有一个 get 方法,该方法 returns 来自 API 的视频对象并将其编程为 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
}
我的看法。更少的代码行、更少的复杂性、更少的文件和更少的刚性是一件好事。为什么还要定义模型?
...making it easier to break an application in the future...
这与使用 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)
时,编译器会警告您不能这样做,因为该函数需要不同类型的参数。
在某些情况下,拥有定义良好的接口更为重要。这取决于您要满足的要求,应用程序的风险等。
例如,在特定项目中,强制对该对象类型使用该方法可能更重要,从而减少错误概率。