用几个简单的工具就能消除一整类的虫子

35 阅读3分钟

你可能听说过ESLint、Prettier和TypeScript。这些都是静态代码分析工具,在 JavaScript 生态系统中非常流行。我认为它们都是测试工具。让我们来看看每一个。

ESLint

ESLint是用于JavaScript的可插拔式提示工具。提示是在不实际运行代码的情况下分析代码的潜在错误的过程。 考虑一下这段代码:

if (!'serviceWorker' in navigator) {
  // the user's using an old browser :-(
}

你发现问题了吗?如果你发现了,那很好!但你不觉得这是个错误吗?但是,你不觉得不用动脑筋去发现和纠正像这样的细微错误会很酷吗?我认为!请让计算机尽可能多地为我做工作,谢谢你。这就是ESLint为你所做的。

伪装

Prettier是JavaScript代码格式化器。它可以接受你的代码,不管你是怎么写的,每次都会以一致和可读的方式重新编排。 当我把Prettier说成是一个测试工具时,人们经常给我疑惑的眼神。 但是,看看这个:

const a = false
const b = false
const c = true
const d = a && b || c

d 这里有什么价值?你知道这些运算符的操作顺序吗?如果你知道,那太好了!但你相信所有的工程师都知道这些运算符的操作顺序吗?但是你相信你的团队中的所有工程师都很了解它们,以至于在重构的时候不会引入一个错误吗?

通过Prettier运行这段代码,你会得到这样的结果:

const a = false
const b = false
const c = true
const d = (a && b) || c

即使你知道操作的顺序,额外的括号--Prettier在你保存文件时自动添加--也是相当有帮助的。如果你意识到这不是你想要的,那么你可以自己添加括号,Prettier会让它保持原样(const d = a && (b || c) )。

这是Prettier使你的代码意图更明显的一个例子--释放你的大脑,让你专注于更难的问题。

TypeScript

这些是JavaScript的静态类型检查器。静态类型检查器将语法添加到JavaScript中,允许你指定一个变量是什么数据类型。它可以在代码中跟踪该变量,以确保它被正确使用。(没有更多的x is not a function.)

你能发现这段代码中的错误吗?

function getFullName(user) {
  const {
    name: {first, middle, last},
  } = user
  return [first, middle, last].filter(Boolean).join(' ')
}

getFullName({first: 'Joe', middle: 'Bud', last: 'Matthews'})

也许你能,也许你不能。也许你的同事可以,也许他们不可以。在任何情况下,如果我们有一些软件可以为我们发现这个问题,那不是很酷吗?让我们把这个函数重写成TypeScript。

type User = {
  name: {
    first: string,
    middle: string,
    last: string,
  },
}
function getFullName(user: User): string {
  const {
    name: {first, middle, last},
  } = user
  return [first, middle, last].filter(Boolean).join(' ')
}

现在,如果我们像以前那样调用它,我们会得到以下结果。

Argument of type '{ first: string; middle: string; last: string; }' is not assignable to parameter of type 'User'.
  Object literal may only specify known properties, and 'first' does not exist in type 'User'.(2345)

我喜欢把TypeScript的类型定义看作是内联自动测试的一种形式。如果你还没有,我强烈建议你试一试。 逐步采用这些工具是可能的(特别是如果你已经在使用babel,你可以直接开始使用babel-preset-typescript )。在你的下一个功能上试试,看看你怎么想。

总结

静态代码分析是显著提高信心的好方法--快速、简单,而且比为整个代码库编写单元测试更省力。这就是为什么它构成了测试战利品🏆的基础如果你还没有使用这些工具,现在就开始吧。