TypeScript 3.7如何提高质量
在本文中,我将介绍最近发布的TypeScript 3.7的一些关键要点。我将通过它们如何影响软件和代码质量的角度来研究这些问题,因为让我们面对现实吧–这就是我的难题。
我已经关注TypeScript版本已有一段时间了。我已经看到了最后的来来去去,并没有对我的日常生活产生重大影响的任何事物。 3.7这样的次要版本听起来并不重要,但它在提高代码质量方面意义非凡。
尽管TypeScript 3.7包含许多令人惊讶的内容,但我将专门针对以下更改进行撰写:
- 可选链接
- 空位合并
- 断言功能
- 声明关键字
- 未调用的功能检查
让我们开始吧。
可选链接
可选链接是一种语法形式,用于在某些内容为空或未定义的情况下进行短路评估。
TypeScript引入了 ?.
运算符,以在对象存在的情况下有选择地调用某些内容。
请看下面新旧做事方式之间的比较:
在.NET世界中的C#中,我们已经有可选的链接,这是我的忠实粉丝。
我喜欢这个是:
- 它使语法简直难以置信,但可读性强
- 它使检查空值变得容易
这两件事对代码和软件质量都有很大帮助。如果我正在检查代码,并且不会因if块的额外语法而分心,则可以专注于真正重要的代码。
同样,如果我是开发方法的开发人员,而该方法的使用时间超出了应有的时间,那么我可能会变得懒惰,并假设已经对变量进行了null检查。这听起来很愚蠢,但我感到自己很想被淘汰,不想走上前去添加一个空支票。
能够快速有条件地检查null是否会比最初想象的更多地帮助提高质量。
空位合并
空位合并是指使用 ??
操作员评估可能为空或未定义的事物。
首先,“ nullish”一词让我发笑,因为它非常适合JavaScript概念。
JavaScript需要这种区别,因为它具有以下概念: null
与…分开但与之相关 undefined
。当然,区别是 null
显然只是什么 undefined
实际上没有被定义为具有任何值。我想动态语言的危险。
例如,空合并的代码片段之前和之后的内容如下:
如您所见,与三元(?
)等价的运算符(如果检查分配情况)。
我喜欢的东西与我喜欢的可选链接的东西相似–它可以帮助您专注于真正重要的代码。
如果我们作为工程师可以消除代码和语法中的额外噪音,那么我们将更容易,更早地发现缺陷。
断言功能
断言功能我更担心。从本质上讲,它们是函数,如果没有错误调用,它们就会对TypeScript的内部类型解释代码进行断言。反过来,这又使编译器可以根据现在证明是正确的事实来捕获更多特定问题。
让我们看一个例子:
这里我们有一个 getStandardFixedNumberString
该函数接受一个已知为 string
或一个 number
。以来 toFixed
不适用于 string
类型,通常不允许使用此代码。
的 assertIsNumber
函数定义了一个断言子句,该子句实质上说“如果没有出错,则函数断言为真,并且对于方法的其余部分可以理解”。
由于我们断言输入是数字,因此在这种情况下,可用于数字的函数将变为可用,因此TypeScript在我们的计算机上没有问题 toFixed
呼叫。
因此,这就是我要讨论的地方:如果您的方法足够长,需要断言函数,则应该将其拆分为较小的方法。
您可能会说断言函数是一种让TypeScript进行运行时类型检查的方法,而不是仅在编译时进行标准静态检查的一种方法。
但是,我不认为TypeScript可以通过在运行时强制执行规则而蓬勃发展。我认为,我们应该在编译时强制输入,然后在边缘验证系统的外部输入。应该声明并强制转换诸如API调用和用户输入之类的内容,而不是主应用程序代码。
尽管如此,断言功能还是需要考虑和注意的,因为它们可能会为将来的其他用途服务。
声明关键字
声明使我们可以将动态类型系统与继承结合起来,从本质上重新声明继承的属性。
看一下下面的简单层次结构:
这里我们有一个 DarkTheme
继承自 Theme
。 Theme
声明一个集合 Person
实体,它本身是一种抽象。
因为我们知道所有使用深色主题的人都很棒,所以我们知道 users
财产也只有 AwesomePerson
实体。
使用TypeScript 3.7,TypeScript也可以理解这一点。
我们使用 declare
关键字,用于告诉TypeScript对某事进行假设,而不会对此假设发出任何特殊要求。以前我用过 declare
引用诸如在共享网页上加载的外部库之类的内容。
在这里我们正在使用 declare
以指定该属性在该上下文中的类型与先前定义的类型不同。
我真的很喜欢这个功能。尽管不像其他语言功能那样常用,但这可以帮助复杂的层次结构团队了解其属性,而无需进行类型声明。
未调用的功能检查
最后,TypeScript现在将捕获我们经常在函数中犯的一个常见错误。看下面的代码:
在这里我们打算调用 person.onlyDoesBoringThings
在第10行,但忘记了 ()
的,而是根据null / undefined对函数进行评估。定义函数,以便条件评估为 true
即使调用也会返回 fasle
。
TypeScript 3.7开箱即用地捕获了此错误:
这项简单的内置检查程序可以提高质量,而无需执行其他任何步骤,因此我全力以赴。
TypeScript 3.7的后续步骤
如果您想了解有关这些功能或TypeScript的其他改进的更多信息,请查看完整的发行说明。
您可以通过运行以下命令通过npm更新到TypeScript 3.7 npm update -g typescript
。
如果您尚未开始使用TypeScript,请参阅我的文章,将现有的JavaScript代码迁移到TypeScript。
您如何看待这些变化?您最兴奋的是什么?您是否有充分的理由使用我没想到的断言函数?
《如何杀死所有缺陷》一文首先介绍了TypeScript 3.7如何帮助质量。