你是对的。当您只需要类型检查时,接口很棒,而当您不仅需要类型检查,而且需要一些方法或需要一些其他逻辑时,类也很棒。
就个人而言,我总是从使用接口开始,一旦我需要一些方法,我会添加一个类并继承接口。我还要补充一点,我
无论您是否使用类,都希望总是有一个接口。这允许您传递/注入接口,而不必多次重新实例化类。
如果我需要一些方法(这意味着我需要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);
我永远不会在任何地方注入或需要导入Person,除非我真的需要“结识”一个新人。我总是可以注入 IPerson 来代替,只要作为类传入的内容,接口将允许我调用所有类方法并根据需要访问属性。
但是,有时我不需要方法,但我需要一个数据契约(或者只是想阻止 TypeScript 被激怒,我没有告诉它一切是什么):
interface IPerson {
firstName: string;
lastName: string;
age: number;
}
const person: IPerson = <IPerson>{
firstName: 'John',
lastName: 'Doe',
age: 44
};
这样做仍然可以为您提供一种方法来动态创建一个符合接口的变量。但是,当你这样做时没有任何方法(所以你会丢失你的 getFullName 函数并且必须手动运行它)
总的来说,我发现自己使用结构化 json 的 http 返回接口。我真的不需要在前端对他们做更多的事情,因为后端已经为我完成了繁重的工作。因此,为每个返回值创建一个类可能有点矫枉过正,但有些人更喜欢这样。
要提出的另一件事是,创建所有这些模型非常耗时。虽然它有回报。在我的一个项目中,我使用 npm 模块根据我的 c# 模型自动生成 TypeScript 接口。这节省了大量的打字时间,并认为这很酷 (https://www.npmjs.com/package/csharp-models-to-typescript)
另一种流行的解决方案是使用Swagger Codegen。你可以'swaggerize'你的后端并让swagger codegen为你生成你的模型和服务。它很光滑。 Here's an example repo 使用 Angular 和 C# 作为后端。
总的来说,这确实是您的偏好。请记住,如果您需要方法和额外的层来构建给定的模型,那么类是最好的。如果您只需要类型而不关心其他花哨的“语法糖”,只需使用接口。正如您所提到的,接口在生产中消失了,所以这当然是一个加分项。
https://jsfiddle.net/mswilson4040/3vznkbq0/7/