我今天来这里是因为我有一个关于Angular 中的类和接口(interface)的问题,如标题所述。
从我的 Angular 来看,我理解这一点:
Interfaces 在 Typescript 中用于执行类型检查,它们在这里直到转译并消失在生产中。此外接口(interface)不能用于实例化。
来自 ES6 的
类 也用于类型检查,但它们在转译和生成代码后保留下来 在生产中。此外,它们用于实例化。
所以,基本上,如果我们在生产中不需要它们,如果我们只需要类型检查,那么接口(interface)是有用的。
相反,如果我们在生产中需要类,特别是实例化,类就在这里。
我是对的,还是我漏掉了一些关于类和接口(interface)的东西?
你是对的。当您只需要类型检查时,接口(interface)很棒,而当您不仅需要类型检查,而且还需要一些方法或需要一些其他逻辑时,类很棒。
就我个人而言,我总是从只使用一个接口(interface)开始,一旦我需要一些方法,我就会添加一个类并继承该接口(interface)。我还要补充一点,我
无论您是否使用类,都希望总是有一个接口(interface)。这允许您传递/注入(inject)接口(interface),而不必多次重新实例化类。
这是一个典型模式的例子,如果我需要一些方法(这意味着我需要一个class
)
interface IPerson {
firstName: string;
lastName: string;
age: number;
getFullName(): string;
}
class Person implements IPerson {
public firstName: string;
public lastName: string;
public age: number;
constructor(firstName: string, lastName: string, age: number) {
this.firstName = firstName;
this.lastName = lastName;
this.age = age;
}
getFullName(): string {
return `${this.firstName} ${this.lastName}`
}
}
const person: IPerson = new Person('John', 'Doe', 44);
我永远不会在任何地方注入(inject)或需要导入 Person
除非我真的需要“更新”一个新人。我总是可以注入(inject) IPerson
,只要作为类传入的内容,接口(interface)将允许我调用所有类方法并按我的意愿访问属性。
然而,有时我不需要方法,但我需要一个数据契约(或者只是想抑制 TypeScript 被激怒我没有告诉它一切是什么):
interface IPerson {
firstName: string;
lastName: string;
age: number;
}
const person: IPerson = <IPerson>{
firstName: 'John',
lastName: 'Doe',
age: 44
};
以这种方式进行操作仍然为您提供了一种 方法来即时创建一个遵循接口(interface)的变量。但是,当您这样做时没有任何方法(因此您丢失了 getFullName
函数并且必须手动运行它)
总的来说,我发现自己在结构化 json 的 http 返回上使用接口(interface)。我真的不需要在前端对它们做更多的事情,因为后端已经为我完成了繁重的工作。因此,为这些返回中的每一个都创建一个类可能有点矫枉过正,但有些人更喜欢这种方式。
要提出的另一件事是创建所有这些模型非常耗时。它得到了返回。在我的一个项目中,我使用了一个 npm 模块来根据我的 c# 模型自动生成 TypeScript 接口(interface)。这节省了大量的打字,并认为它非常酷 (https://www.npmjs.com/package/csharp-models-to-typescript)
另一个流行的解决方案是使用 Swagger Codegen .您可以“swaggerize”您的后端,让 swagger codegen 为您生成模型和服务。它很光滑。 Here's an example repo使用 Angular 和 C# 作为后端。
总的来说,这确实是您的偏好。请记住,如果您需要方法和额外的层来构建给定的模型,那么类是最好的。如果您只需要类型而不关心其余花哨的“语法糖”,只需使用接口(interface)即可。正如您所提到的,接口(interface)在生产中消失了,所以这当然是一个优势。
https://jsfiddle.net/mswilson4040/3vznkbq0/7/