普通对象 VS 模型对象的类实例

2024-03-04

在 Angular / TypeScript 中创建模型对象的最佳实践是什么:

  1. 我应该使用带有对象表示法的类型注释(对象是Object)? E.g. let m: MyModel = { name: 'foo' }

  2. 我应该使用new运算符(对象是各自原型的实例)?

  3. 这两种方法是否应该混合使用并根据具体情况使用? (例如普通对象,当收到来自HttpClient, but new MyModel('foobar')为了方便通过将属性作为构造函数参数传递来创建实例)

这个问题的背景

我是 TypeScript 的新手,和许多其他开发人员一样,我来自流行的面向对象语言,例如 Java。

我理解的一个核心概念是 TypeScript 中的类型注释在运行时不起作用。它们对于编译器和编辑器的自动完成非常重要。基本上它是 ECMAScript 加上编译时类型检查。

当时我不知道这一点,并期望 TypeScript 是某种“客户端 Java”,我发现了这个 Angular 错误报告:https://github.com/angular/angular/issues/20770 https://github.com/angular/angular/issues/20770

人们(不理解 TypeScript 类型概念的人)抱怨HttpClient不将返回的普通对象转换为其模型类类型。其他人则为这种行为辩护,并指出 JavaScript 中没有运行时类型。

我的问题就出现了:事实上 JavaScript 中有运行时类型。您可以使用以下命令创建原型实例new运算符,甚至用以下命令检查它们的构造函数instanceof操作员。

在 TypeScript 中,您有两种创建实例的方法:

1)使用对象表示法(如它们在角度教程 https://angular.io/tutorial/toh-pt1#create-a-hero-class):

hero: Hero = {
  id: 1,
  name: 'Windstorm'
};

2)使用new-操作员:

hero: Hero = new Hero();

目前我正在开发一个混合了这两个选项的项目。 IE。相同类型的模型对象是以下对象的实例Object在某些情况和情况下Hero在其他情况下。

我预计这会导致稍后出现问题,因为构造函数仅在后一种情况下被调用。

我的规则/最佳实践的想法是将所有模型实例定义为普通对象,并使用通过依赖注入创建的服务、组件等的构造函数。结果我不会使用new根本没有操作员。

但是我不确定这是否是一个好主意,而且我找不到最佳实践关于它的推荐。

EDIT

对于密切选民的重要提示:我不是在这里寻求您的个人意见。我宁愿寻找某种官方记录的 Angular 最佳实践,因为我认为这是必须从项目一开始就做出的核心设计决策,并且这些方法不应在没有特定原因的情况下随机混合。也许答案只是一个简单的“没有官方建议做出哪个决定”。


在我看来,你应该使用new如果您需要对对象本身执行复杂的操作,则可以使用运算符来创建类的新对象。

如果您只需要访问属性,您可以使用对象文字来创建一个新对象。

它具有封装、继承等优点,对于来自 Java 背景的开发人员来说更能体会到这些优点。

如果您像下面这样直接分配一个对象,那么您必须在其中显式设置函数,例如,getName功能。

hero: Hero = {
  id: 1,
  name: 'Windstorm',
  getName: function(){ // returns name }
};

然而,通过定义一个类Hero有一个函数getName然后创建该类的实例,您会自动得到function,无论您创建多少次实例。

为了更好地理解面向对象的 Javascript,您可以点击以下链接:-

https://developer.mozilla.org/en-US/docs/Learn/JavaScript/Objects/Object-oriented_JS https://developer.mozilla.org/en-US/docs/Learn/JavaScript/Objects/Object-oriented_JS


关于下面的问题,

“人们(不理解 TypeScript 类型概念的人)抱怨 关于 HttpClient 没有将返回的普通对象转换为它们的 模型类类型。”

HttpClient只是返回服务器发送的一个对象,由JS将其转换为所需的形式。您始终可以使用其构造函数将响应映射到所需的模型实例,其定义如下:-

constructor(hero){
  this.id = hero.id;
  this.name = hero.name;
}

您可以映射从服务器返回的数组,如下所示:-

map(hero => new Hero(hero))
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

普通对象 VS 模型对象的类实例 的相关文章

  • 为什么 JavaScript base-36 转换看起来不明确

    我目前正在编写一段使用 Base 36 编码的 JavaScript 我遇到了这个问题 parseInt welcomeback 36 toString 36 看来要回归了 welcomebacg 我在 Chrome 开发者控制台和 Nod
  • 尝试将布尔 C# 变量传递给 javascript 变量并将其设置为 true

    在我的 aspx 页面中 我将布尔变量 C 传递给需要布尔类型的 javascript 函数 但遇到了问题 但是 C 变量返回 True 而 javascript 不喜欢大写 myjavascript 如果我将 c 变量转换为字符串 那么我
  • 解析“流”JSON

    我在浏览器中有一个网格 我想通过 JSON 将数据行发送到网格 但浏览器应该在接收到 JSON 时不断解析它 并在解析时将行添加到网格中 换句话说 在接收到整个 JSON 对象后 不应将行全部添加到网格中 应该在接收到行时将其添加到网格中
  • 如何重置使用 JavaScript 更改的 CSS 属性?

    我的导航按钮的宽度从 100px 增加到 150px 当鼠标悬停在 nav li hover width 150px 但是使用 javascript 我已经做到了 无论选择哪个选项 宽度都将继续为 150px 当选择每个选项时 它会使其他选
  • 使用 JavaScript 使链接保持活动状态并在单击时显示悬停效果

    I am struggling to make this work I d like to make it where if O F is clicked the hover state stays active if another li
  • Google App Engine:修改云运行环境

    我正在尝试部署一个使用自定义 Node js 服务器的 Next js 应用程序 我想将自定义构建变量注入应用程序 next config js const NODE ENV process env NODE ENV const envTy
  • Meteor - 从客户端取消服务器方法

    我正在通过服务器方法执行数据库计数 用户可以选择他们希望如何执行计数 然后调用该方法 我的问题是 计数可能需要一些时间 并且用户可能会在方法运行时改变主意并请求不同的计数 有什么方法可以取消调用的方法并运行新的计数吗 我认为 this un
  • 跟踪用户何时点击浏览器上的后退按钮

    是否可以检测用户何时单击浏览器的后退按钮 我有一个 Ajax 应用程序 如果我可以检测到用户何时单击后退按钮 我可以显示适当的数据 任何使用 PHP JavaScript 的解决方案都是优选的 任何语言的解决方案都可以 只需要我可以翻译成
  • 在 webpack 2.x 中使用 autoprefixer 和 postcss

    如何使用autoprefixer使用 webpack 2 x 以前 它曾经是这样的 module loaders test scss loader style css sass postcss postcss gt return autop
  • Babel 7 Jest Core JS“TypeError:wks不是函数”

    将我的项目升级到 Babel 7 后 通过 Jest 运行测试会抛出以下错误 测试在 Babel 6 中运行没有任何问题 但在 Babel 7 中失败并出现以下错误 TypeError wks is not a function at Ob
  • Angular 2+ 安全性;保护服务器上的延迟加载模块

    我有一个 Angular 2 应用程序 用户可以在其中输入个人数据 该数据在应用程序的另一部分进行分析 该部分仅适用于具有特定权限的人员 问题是我们不想让未经授权的人知道how我们正在分析这些数据 因此 如果他们能够在应用程序中查看模板 那
  • 如何使用tampermonkey模拟react应用程序中的点击?

    我正在尝试使用 Tampermonkey 脚本模拟对 React 元素的点击 不幸的是 由于 React 有自己的影子 DOM 所以天真的方法使用document querySelector 不工作 我遇到了一些需要修改 React 组件本
  • 为 illustrator 导出脚本以保存为 web jpg

    任何人都可以帮我为 illustrator CC2017 编写一个脚本 将文件以 JPG 格式导出到网络 旧版 然后保存文件并关闭 我有 700 个文件 每个文件有 2 个画板 单击 文件 gt 导出 gt 另存为 Web 旧版 然后右键文
  • FireFox 中的自动滚动

    我的应用程序是实时聊天 我有一个 Div 来包装消息 每条消息都是一个 div 所以 在几条消息之后 我的 DOM 看起来像这样 div div Message number two div div div div
  • 如何获取给定 DOM 元素的所有定义的 CSS 选择器?

    如何使用 jQuery 获取给定 DOM 元素的所有定义的 CSS 选择器 定义后 我的意思是在应用于任何样式表的所有 CSS 选择器document 在某种程度上 这类似于 FireBug 实现的功能 其中显示所选 DOM 元素的所有应用
  • 有没有办法阻止 prettier / prettier-now 将函数参数分解为新行

    当使用 prettier prettier now 在保存时进行格式化时 当一个函数包装另一个函数时 它会中断到一个新行 我想知道是否有办法阻止这种行为 例如 期望的输出 app get campgrounds id catchAsync
  • Angular 2获取元素高度

    我这里有一个非常简单的例子 它只是一个带有单个 div 的角度应用程序 是否可以获取div的角度高度 我想我可以用 ViewChild 和 offsetHeight 来做到这一点 import Component ElementRef Vi
  • 使用 Ajax 请求作为源数据的 Jquery 自动完成搜索

    我想做的事 我想使用 jquery 自动完成函数创建一个输入文本字段 该函数从跨域curl 请求获取源数据 结果应该与此示例完全相同 CSS 在这里并不重要 http abload de img jquerydblf5 png http a
  • Angular 6 + RxJS 6.0:如何将新元素推送到 Observable 包含的数组

    我从 firebase 服务器分块接收数据 同时渲染该数据需要一个坚持可观察包含数组的库 我不知何故无法将新的数据块推送到可观察到的现有数据块数组 从数据服务中 我通过主题的下一个调用并尝试添加新的 calEvent this homeWo
  • 如何从图像输入中获取 xy 坐标?

    我有一个输入设置为图像类型

随机推荐