当前位置: 首页 > 知识库问答 >
问题:

在Angular项目中何时使用类或接口?[关闭]

程枫
2023-03-14

我今天在这里是因为我有一个问题,就像标题所说的,关于Angular中的类和接口。

在我看来,我理解这一点:

接口在Typescript中用于执行类型检查,它们一直在这里,直到发生转换并在生产中消失。此外,接口不能用于实例化。

来自ES6的类也用于类型检查,但它们会在转换后保留,并在生产中生成代码。此外,它们还用于实例化。

所以,基本上,若我们在生产中不需要它们,若我们只需要进行类型检查,那个么接口是有用的。相反,如果我们在生产中需要类,特别是在实例化中,类就在这里。

我是对的,还是我遗漏了一些关于类和接口的内容?

共有2个答案

晏望
2023-03-14

因为你在问题中也标记了Angular,所以我想从Angular的角度来补充答案。

Angular还使用Interface(或类)作为通过超文本传输协议检索数据的结构。

export interface Product {
  id: number;
  productName: string;
  productCode: string;
  tags?: string[];
  price: number;
  description: string;
  imageUrl: string;
}

@Injectable({ providedIn: 'root' })
export class ProductService {
  private productsUrl = 'api/products';

  constructor(private http: HttpClient) { }

  getProducts(): Observable<Product[]> {
    return this.http.get<Product[]>(this.productsUrl);
  }
}

http。get方法获取数据并填充提供的产品数组结构。这使得处理来自组件的数据变得更加容易。

耿永寿
2023-03-14

你是对的。当您只需要类型检查时,接口非常好,而当您不仅需要类型检查,还需要一些方法或需要一些其他逻辑时,类非常好。

就我个人而言,我总是从仅仅使用一个接口开始,一旦我需要一些方法,我会添加一个类并继承这个接口。我还想补充一点,无论您是否使用类,我都希望始终拥有一个接口。这允许您传递/注入接口,而不必多次重新实例化类。

下面是一个典型模式的例子,如果我需要一些方法(这意味着我需要一个

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);

我永远不会在任何地方注射或导入,除非我真的需要“更新”一个新人。我总是可以注入IPerson,只要传入的是类,接口就会允许我调用所有类方法并访问属性。

然而,有时我不需要方法,但我需要一个数据契约(或者只是想抑制TypeScript生气,我不告诉它一切是什么):

interface IPerson {
    firstName: string;
    lastName: string;
    age: number;
}

const person: IPerson = <IPerson>{
    firstName: 'John',
    lastName: 'Doe',
    age: 44
};

这样做仍然可以让您快速创建粘附到接口的变量。然而,当你这样做的时候没有方法(所以你失去了你的getFullName函数,必须手动运行)

总的来说,我发现自己在http返回上使用的是结构化json接口。我真的不需要在前端对他们做更多的事情,因为后端已经为我完成了繁重的工作。因此,为这些回报中的每一个创建一个类可能有些过分,但有些人更喜欢这样。

还有一件事要提的是,创建所有这些模型非常耗时。不过,这是值得的。在我的一个项目中,我使用npm模块根据我的c#模型自动生成TypeScript接口。这节省了大量的打字时间,而且觉得这很酷(https://www.npmjs.com/package/csharp-models-to-typescript)

另一个流行的解决方案是使用Swagger Codegen。你可以“大摇大摆”你的后端,让大摇大摆的codegen为你生成模型和服务。它很光滑。下面是一个使用Angular和C#作为后端的回购示例。

一般来说,这确实是你的偏好。请记住,如果您需要方法和额外的层来构建给定的模型,那么类是最好的。如果您只需要类型,而不关心其他奇特的“语法糖”,只需使用接口即可。正如您所提到的,接口在生产中消失了,所以这当然是一个优势。

https://jsfiddle.net/mswilson4040/3vznkbq0/7/

 类似资料:
  • 我正在学习角度,选择了一个视频课程和一本pdf书,现在我对“出口”关键字的使用感到困惑... 两门课的一个例子来展示我的困惑...我只需要朝正确的方向快速踢一脚,就能克服这个小障碍。 Visual Studio 2017 示例项目使我在clientapp/app文件夹中创建了一个接口文件夹,并在其中放置了一个接口“answer.ts”。这是没有关键字“导出”。

  • 我见过类似这样的相关问题,但它们都假设类和接口的区别在于类可以实例化,而接口不能。然而,以@types/google.maps为例,例如: 接口和类: 延伸其他对象 具有属性 具有方法/功能 无法从这些定义直接实例化 在google maps代码中的某个地方,实际上有一个类用于这里定义的< code >类和这里定义的< code >接口。看起来类定义是用户可以实例化的,而不是库可以内部实例化的(接

  • 我无法确定您何时(如果有的话)想要在typescript中为变量使用而不是。假设以下两种情况: 我可以用两个变量定义一个完全相同的was

  • 问题内容: 我们将使用Angular最新版本1.4开始使用Angular和Kendo组件启动新项目,但是我听说Angular 2.0包含太多新功能,但与此同时,它不具有向后兼容性。 由于没有宣布发布日期,我们对于等待2.0发布日期还是继续1.4感到困惑。 请提出建议。 问题答案: Angular 1.x至少要保留三年。原因如下: 最初,谷歌表示他们将支持AngularJS1.x。在2015年末发布

  • 问题内容: 两者之间有什么区别,哪个更好使用?为什么? 问题答案: 是interface,哪里是class,并且此类实现接口。 我希望使用第二种形式,这种形式更通用,即如果您不使用特定于方法的方法,则可以将其类型声明为接口类型。使用第二种形式,将实现从实现更改为实现接口的其他类将变得更加容易。 编辑: 由于许多SO用户都评论了这两种形式都可以是接受或的任何方法的参数。但是当我声明方法时,我更喜欢接