【发布时间】:2018-08-08 08:40:54
【问题描述】:
在 Angular / TypeScript 中创建模型对象的最佳实践是什么:
我应该将类型注释与对象表示法一起使用(对象是
Object的普通实例)吗?例如。let m: MyModel = { name: 'foo' }我应该使用
new运算符(对象是各自原型的实例)吗?是否应该混合使用这两种方法并根据情况使用? (例如普通对象,当接收到来自
HttpClient的响应时,但new MyModel('foobar')是为了方便通过将属性作为构造函数参数传递来创建实例)
这个问题的背景
我是 TypeScript 的新手,和许多其他开发人员一样,我来自 Java 等流行的面向对象语言。
我理解的一个核心概念是,TypeScript 中的类型注解在运行时不起任何作用。它们对于编译器和编辑器的自动完成很重要。基本上它是添加了编译时类型检查的 ECMAScript。
当时我不知道这一点,并期望 TypeScript 是某种“客户端 Java”,我发现了这个 Angular 错误报告: https://github.com/angular/angular/issues/20770
人们(不了解 TypeScript 的类型概念)抱怨 HttpClient 没有将返回的普通对象转换为他们的模型类类型。其他人正在为这种行为辩护,并指出 JavaScript 中没有运行时类型。
这里出现了我的问题:事实上,JavaScript 中有运行时类型。您可以使用 new 运算符创建原型实例,甚至使用 instanceof 运算符检查其构造函数。
在 TypeScript 中,您有两种创建实例的方法:
1) 使用对象表示法(如Angular tutorial 中所示):
hero: Hero = {
id: 1,
name: 'Windstorm'
};
2) 使用new-运算符:
hero: Hero = new Hero();
目前我正在处理一个混合了这两个选项的项目。 IE。相同类型的模型对象在某些情况下是Object 的实例,在其他情况下是Hero 的实例。
我预计这会导致以后出现问题,因为构造函数只在后一种情况下被调用。
我对规则/最佳实践的想法是将所有模型实例定义为普通对象,并将构造函数用于依赖注入创建的服务、组件等。因此,我根本不会使用 new 运算符。
但我不确定这是否是个好主意,也找不到关于它的最佳实践建议。
编辑
给亲密选民的重要提示:我不是在这里寻找您的个人意见。我宁愿寻找某种官方记录的 Angular 最佳实践,因为我认为这是一个核心设计决策,必须从项目开始就做出,并且这些方法不应该在没有特定原因的情况下随意混合。也许答案只是一个简单的“没有官方建议做出哪个决定”。
【问题讨论】:
-
我个人对此事的看法:如果您使用对象中的函数,请创建一个类的实例。如果您只处理属性,请将您的答案作为界面输入。
-
我还发现包含嵌套对象数组的模型对象存在问题。使用构造函数,您可以提供一个空数组。普通对象的属性将是
undefined并且运行时异常的可能性更高 -
这不是普通对象的问题,而是您自己的代码的问题。这就像说类存在问题,因为如果您不在构造函数中编写它,它不会创建空数组。
-
我的评论是对你的评论的补充。数组属性是真实实例优于普通对象的另一种情况。
-
我知道,我正在纠正你所说的,因为我发现它不真实。同样,类实例与普通对象相比“没有优势”:两者处理数组的方式相同。
标签: javascript angular typescript prototypal-inheritance