在 Typescript 中使用接口或 class 时

When use a interface or class in Typescript

我有一个简单的登录场景,需要用户在 Typescript 中输入电子邮件和密码。我需要创建一些类型来获得这种强类型并将其发送到后端。

这个应该写成:

export interface UserLogin {
  email: string;
  password: string;
}
//OR
export class UserLogin {
  email: string;
  password: string;
}

以及如何知道何时使用这些方案?

在最基本的情况下,class 本质上是一个 对象工厂(即对象的蓝图应该看起来像然后实现),而 接口 是一个仅用于 类型检查 的结构。

虽然 class 可能已初始化属性和方法来帮助创建对象,但 接口 本质上定义了属性和对象可以具有的类型。

在您描述的场景中,可以使用 接口 来设置 UserLogin 的类型。

send it to the back-end

通过网络发送 classes 需要额外的努力 - 如果您使用 JSON 内容类型,您的 class 将作为普通对象出现在您的后端代码中。有关如何将 JSON 转换回 class 对象以便调用其方法的问题,请参阅 numerous answers

但是由于你问题中的 class 没有方法,所以没关系,除非后端代码将使用 instanceof.

执行运行时检查

为了避免这些问题,使用只有数据成员的接口来表示与后端通信的对象。

实际上两者都可以完成这项工作。如果您只是进行类型检查,我建议您使用接口,因为它是专门为此目的而设计的。

Classes and interfaces are powerful structures that facilitate not just object-oriented programming but also type-checking in TypeScript. A class is a blueprint from which we can create objects that share the same configuration - properties and methods. An interface is a group of related properties and methods that describe an object, but neither provides implementation nor initialisation for them.

发件人:https://toddmotto.com/classes-vs-interfaces-in-typescript

如果您只需要声明自定义类型,则使用接口。 IMO,有一个非常务实的原因——它们不会被转换成 JavaScript,所以生成的代码更短。

如果您需要使用构造函数实例化对象或使用实例化并注入对象的框架,则接口将无法工作。然后使用类或者抽象类.