angular - 什么时候在 Angular 项目中使用类或接口(interface)?

标签 angular typescript class model

<分区>

我今天来这里是因为我有一个关于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/

关于angular - 什么时候在 Angular 项目中使用类或接口(interface)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54356711/

相关文章:

css - 如何在angular6中应用样式

有 Angular Material : No provider for dialogRef

javascript - 如何基于 javascript/typescript 中的另一个数组创建动态数组?

reactjs - Next.Js Redux Wrapper w/Typescript - 实现错误,存储类型不存在

javascript - Firebase 单元测试错误 - 无法解析 Firebase 网址

c++ - 奇怪的段错误就在 main 的开始

ajax - 元组的 Angular HTTP 可观察对象

angular - ng-packagr:构建错误 EPERM:不允许操作

c++ - 具有多个参数的对象数组

java - 在主类方法中找不到字符串方法