如何为数据对象生成dto ?

昨天,我们看到如何使用json2ts生成类型定义用于我们的Angular应用。此外,我们还看到接口在性能方面是最优的。然而,接口需要注意的是,它们不能单独充当数据传输对象(Data Transfer Object, DTO)来更改您正在处理的数据,也不能执行任何运行时检查。

因此,有些人可能更喜欢使用Quicktypejson2ts因为当从JSON字符串生成代码时,它有更多的配置选项:

如您所见,这些选项启用了其他功能,例如使用联合类型而不是枚举(如建议早些时候),如果您正在解析的对象没有正确的形状就抛出错误,甚至一些DTO操作,例如在属性名称中使用驼峰大小写而不是下划线。

当然,您可以根据需要调整生成的代码并添加额外的DTO规则。

Quicktype还支持TypeScript以外的语言,所以你可以使用相同的工具为你的数据生成服务器端类型,例如Java、c#或Python。

如何为TypeScript生成类型定义?

本周,我们一直在关注联合类型S和使用的缺点任何未知的当我们没有任何准确的类型信息时。

今天,让我们看看如何从任何JSON数据生成类型信息。我想提到的第一个工具是json2ts.com在这个网站上,你可以复制粘贴任何JSON语法块,并获得带有推断类型和所有内容的接口的全类型输出。

例如,如果我复制粘贴以下JSON到json2ts:

我们得到了下面一组准备在代码中使用的接口:

你给的数据越多json2ts,它就越精确。例如,如果你给它一个类似对象的数组,json2ts可以识别某些属性是可选的还是支持多种不同的类型。

另外,值得一提的是接口是比课堂更好描述类型信息,因为它们根本不会被编译成任何东西(如联合类型),从而为代码带来类型安全,而不会使产品代码变得更大。

TypeScript中的联合类型

昨天,我们讨论了任何未知的,以及使用这种类型的利弊。

今天,我们来关注一下联盟类型的替代品枚举更高效、更灵活地描述自定义类型。假设我们需要在应用程序中支持不同的货币。由于货币主要是一种代码/符号,我们可以采取简单的路线并执行以下操作:

但这对我们帮助不大。例如,是any字符串有效的货币?绝对不会。所以更好的选择是创建一个枚举并描述其中所有可能的值:

现在我们有一个合适的类型来描述a货币是多少。但枚举并不那么方便,因为它们不能按原样在Angular组件模板中使用一些解决方法。同时,它们被编译成JavaScript的怪物结构这毫无理由地增加了代码包的大小,因为我们没有在浏览器运行时进行类型检查。

输入联合类型

联合类型解决了所有这些问题。它们是轻量级的,根本不需要编译成任何东西,这意味着它们的性能总是比枚举(更少的代码下载+更少的代码解释=更快的应用程序在浏览器中)。它们保证类型安全,可以由任何东西组成,包括字符串:

使用联合类型可以做更多的事情,例如为给定变量提供比单一类型更多的选项:

Angular使用联合类型很多。例如,如果你曾经使用过激活路由器保护,它的签名支持多达6种不同的返回类型,所有返回类型都定义为联合类型:

当特定子类型需要更多粒度时,我们可以使用联合类型的联合:

TypeScript: any vs. unknown

TypeScript有一些抽象类型对Angular应用很有帮助。大多数人都遇到过这种类型任何在某些时候,它已经成为几个项目中典型的反模式,开发人员决定:"我不想为这个对象使用合适的类型,所以我将使用任何

原因如下任何危险,不建议使用:

现在,如果我们替换任何未知的,事情看起来不一样了:

如你所见,未知的保持类型安全。如果我们从第三方库接收一个对象,并需要将它传递给另一个函数,未知的非常适合。

一种思考方式是未知的是:我们不知道这个物体里面是什么,所以我们不允许碰它;我们会把它储存起来或者传阅

在这一点上,我想不出我们为什么需要在Angular代码中使用任何好的理由。使用任何拒绝正确使用TypeScript,退回到无类型JavaScript。

在接下来的几天里,我们将介绍不同的技术和工具,我们可以用来创建准确的类型信息,所以我们不需要任何未知的了。