本文首发于个人博客( 点此查看),欢迎关注。
最近在作项目代码重构,其中有一个要求是为代码添加智能提示和类型检查。智能提示,英文为 IntelliSense,能为开发者提供代码智能补全、悬浮提示、跳转定义等功能,帮助其正确而且快速完成编码。提及来,JavaScript 做为一门动态弱类型解释型语言,变量声明后能够更改类型,而且类型在运行时才能肯定,由此容易产生大量代码运行中才能发现的错误,相比 Java 等静态类型语言,开发体验上确实差了一截。更烦躁的是,智能提示就是依赖于静态类型检查的,因此在之前,期望 JavaScript 的智能提示完善度追上 Java 基本不可能。固然,时代在进步,TypeScript 已经问世许久,为 JavaScript 带来了静态类型检查以及其余诸多特性。JavaScript 的智能提示也已有了解决方案。调研了一段时间后,下文以 VSCode 编辑器做为开发工具,介绍一下如何为 JavaScript 加上智能提示以及类型检查。javascript
JSDoc 是目前最通用的 JavaScript API 文档生成器,根据其语法编写代码注释,能够十分方便地自动生成文档。因为 JSDoc 能提供详细的类型信息,其也被 VSCode 等编辑器接受应用于智能提示。例如,可使用 @type
标签来赋予部分声明的 object 一个特殊类型:html
/** * @type {{a: boolean, b: boolean, c: number}} */ var x = {a: true}; x.b = false; x. // <- 因为 type 声明,"x" 将被提示含有属性 a,b 以及 c
JSDoc 最多见的使用是为函数的参数声明类型,使用 @param
来完成:java
/** * @param {string} param1 - 这里能够用于解释参数含义 */ function Foo(param1) { this.prop = param1; // param1 (以及 this.prop)均为 string 类型 }
为代码添加 JSDoc 注释使得阅读和理解代码更加方便(代码交接时不再用抓狂了,固然前提是注释写得好),也保障了开发时的体验而且下降了不少运行时才能发现的数据类型方面的 bug。VSCode 基本支持 JSDoc 的常见语法,具体使用可参见JSDoc support in JavaScript。node
除了使用 JSDoc 提早声明类型,更为激进的作法是直接使用微软开发的 TypeScript,为整个项目带来完善的静态类型检查。固然,对于老项目来讲,改造的成本较为巨大(使用 Flow 也相似,要动的代码太多,何况 Flow 烂尾了)。不过因为和 TypeScript 师出同门,VSCode 可以直接读取前者的类型声明文件,来为 JavaScript 提供智能提示(实际上 JavaScript 的智能提示功能就是基于 TypeScript 团队为 VSCode 提供的 JavaScript 语言服务开发的)。 TypeScript 的类型声明文件以 .d.ts
为后缀,用于描述同名的 JavaScript 文件导出代码的类型,功能上相似于 C 语言的 .h
头文件。不严格地来讲,ts 类型声明文件就像用 TypeScript 语法将 JSDoc 的注释重写了一遍并提取到了单独的文件中。VSCode 更是将两者做了融合,当你两者混用的时候,能够直接在 JSDoc 的注释中直接使用 ts 类型声明文件中定义的 interface 和 class 等。直接使用官方提供的示意图(图中是 Visual Studio,不过无伤大雅):git
对于本身的代码,能够编写对应的 ts 类型声明文件,而对于引用的第三方库,社区一样提供了解决方案:DefinitelyTyped 提供了常见的第三方库的类型声明文件。VSCode 有不少第三方库已经内置类型声明文件,本身下载的话直接使用 npm 便可:github
# @types + 第三方库名称 npm i @types/express
关于 ts 类型声明文件的语法等相关信息,参见官网介绍。typescript
另外,在 VSCode 中,类型检查并不是默认开启,这意味着即便你有详尽的 JSDoc 注释或 ts 类型声明文件,依然可能在数据类型上栽跟头。开启方式为在项目根目录下添加 jsconfig.json
文件,并设置 "checkJs": true
,示例以下:shell
{ "compilerOptions": { "checkJs": true }, // 位于此目录下的文件不进行静态检查和智能提示 "exclude": [ "node_modules", "**/node_modules/*" ] }
最后,不管是对老项目的改造或是新项目的开发,使用以上的方式添加智能提示和类型检查显而易见会略微拖慢开发速度,但咱们认为,与智能提示带来的开发体验、将不少可能在运行时才能发现的错误经过类型检查前置解决、顺手完成的详细文档以及重构代码时的信心相比,这点速度的牺牲是值得的。express
参考文档: