【问题标题】:Does using strongly typed classes result in more efficient Javascript?使用强类型类会导致更高效的 Javascript 吗?
【发布时间】:2017-10-27 18:35:39
【问题描述】:

我正在将大型 .NET WinForms 业务应用程序移植到 Angular。我有一个包含大量(~1500)实体的数据模型。在 .NET 应用程序中,每个实体都由一个简单的类建模,这些类中的绝大多数除了公开实体字段的属性之外没有任何方法。它们基本上仅用于类型安全。

在基于 Javascript 的应用程序中重现这一点是一个好主意,还是(因为我使用的是 Typescript)我应该只使用接口来强制编译时类型安全?鉴于 Javascript 定义对象的方法更灵活,我可以在运行时添加我需要的属性吗?

我特别想知道大量的类定义是否会影响性能,或者更确切地说,拥有强类型类是否真的会提高性能。

【问题讨论】:

  • 是什么让您怀疑它们会提高性能?
  • 在编译语言中,知道数据的形状意味着可以优化代码,我只是不确定同样的想法是否适用于 Javascript?
  • 不,这实际上只是一个编译器技巧 - 类似于 get;放;在.Net中
  • 类型只影响编译期间的类型检查。它们在运行时不存在(装饰器发出的类型除外)。 鉴于 Javascript 定义对象的更灵活方法,我可以在运行时添加我需要的属性吗? - 这样就失去了类型安全性。如果你不需要 TS 提供的东西,即类型安全、IDE 自动补全和自文档,请坚持使用 JS。
  • 我认为如果您使用 getter 和 setter,TS 属性类型会以某种方式保留在 JS 中,但似乎我的直觉再次发现在 JS 方面缺乏!基本上一个函数没有可靠的返回类型——它可以返回任何东西?但是,我没有看到通过在运行时向对象添加属性来失去类型安全性?假设我有一些从 API 调用返回的 JSON,使用 JSON.parse 并将结果对象设置为我的接口中定义的类型变量。从现在开始,我有编译器类型检查和 IDE 自动完成功能,这正是我想要的,不是吗?

标签: javascript angular typescript


【解决方案1】:

tldr;我只会使用接口来定义您需要的数据形状,因为这在 JS 代码中更容易使用。

This SO answer 指出在实例化大量对象之前差别不大——我会说每秒数百万个对象。

Here's a good article 在 Node 中的性能,它将让您了解它在 Chrome 中的表现(对其他浏览器只字不提)。

比性能效率更大的问题是开发人员的效率。我认为接口作为一种更轻量级的语言结构,比类更容易推理。事实上,很容易将现有接口与其他类型、接口或匿名类型混合,如下所示:

interface Map {
  map: Function
}

interface Reduce {
  reduce: Function
}

type CustomType = Map & Reduce & { sum: Function }

const a: CustomType = {} // now you need to implement map, reduce, and sum

您只需获得如此多的推理能力,而无需 class 关键字和 0 开销。但是,如果类与您的团队/代码库/用例更好地结合,那就去吧。仅使用 1500 个就不会产生显着的运行时开销。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-02-11
    • 1970-01-01
    • 1970-01-01
    • 2010-09-19
    • 1970-01-01
    • 2021-06-23
    • 2017-01-23
    • 1970-01-01
    相关资源
    最近更新 更多