【问题标题】:When use a interface or class in Typescript [duplicate]在 Typescript 中使用接口或类时 [重复]
【发布时间】:2019-01-13 22:55:29
【问题描述】:

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

这应该写成:

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

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

【问题讨论】:

  • 一个主要区别是接口纯粹是一个打字稿结构,只在编译时使用——也就是说,接口对最终转译的 javascript 输出没有任何添加,它们完全消失了(这很好! )。然而,类存在于 javascript 中,因此您在 typescript 代码中创建的每个类也将存在于 javascript 输出中。如果您想要/需要的只是在编译时进行类型检查,那么这是使您的 js 文件变大的膨胀。因此,如果满足您的需求,请坚持使用接口,切勿抢先添加类,仅在需要时才添加类。

标签: typescript class web interface strong-typing


【解决方案1】:

在最基本的情况下,本质上是一个对象工厂(即一个对象应该是什么样子然后实现的蓝图),而一个interface 是一种仅用于类型检查 的结构。

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

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

【讨论】:

    【解决方案2】:

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

    如果您需要使用构造函数实例化对象或使用实例化和注入它们的框架,则接口将不起作用。然后使用类或抽象类。

    【讨论】:

      【解决方案3】:

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

      类和接口是强大的结构,不仅有助于面向对象编程,还有助于 TypeScript 中的类型检查。类是一个蓝图,我们可以从中创建共享相同配置(属性和方法)的对象。接口是一组描述对象的相关属性和方法,但既不为它们提供实现,也不提供初始化。

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

      【讨论】:

        【解决方案4】:

        发送到后端

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

        但是由于您问题中的类没有方法,所以没关系,除非后端代码将使用instanceof 执行运行时检查。

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2017-02-07
          • 2016-06-26
          • 2020-04-09
          • 1970-01-01
          • 1970-01-01
          • 2016-06-26
          • 1970-01-01
          相关资源
          最近更新 更多