如何为你的JS项目添加智能提示与类型检查详解


Posted in Javascript onMarch 12, 2019

前言

最近在做项目代码重构,其中有一个要求是为代码添加智能提示和类型检查。智能提示,英文为 IntelliSense,能为开发者提供代码智能补全、悬浮提示、跳转定义等功能,帮助其正确并且快速完成编码。说起来,JavaScript 作为一门动态弱类型解释型语言,变量声明后可以更改类型,并且类型在运行时才能确定,由此容易产生大量代码运行中才能发现的错误,相比 Java 等静态类型语言,开发体验上确实差了一截。更烦躁的是,智能提示就是依赖于静态类型检查的,所以在以前,指望 JavaScript 的智能提示完善度追上 Java 基本不可能。当然,时代在进步,TypeScript 已经问世许久,为 JavaScript 带来了静态类型检查以及其他诸多特性。JavaScript 的智能提示也已有了解决方案。调研了一段时间后,下文以 VSCode 编辑器作为开发工具,介绍一下如何为 JavaScript 加上智能提示以及类型检查。

基于 JSDoc

JSDoc 是目前最通用的 JavaScript API 文档生成器,根据其语法编写代码注释,可以十分方便地自动生成文档。由于 JSDoc 能提供详细的类型信息,其也被 VSCode 等编辑器接受应用于智能提示。例如,可以使用 @type 标签来赋予部分声明的 object 一个特殊类型:

/**
 * @type {{a: boolean, b: boolean, c: number}}
 */
var x = {a: true};
x.b = false;
x. // <- 由于 type 声明,"x" 将被提示含有属性 a,b 以及 c

JSDoc 最常见的使用是为函数的参数声明类型,使用 @param 来完成:

/**
 * @param {string} param1 - 这里可以用于解释参数含义
 */
function Foo(param1) {
 this.prop = param1; // param1 (以及 this.prop)均为 string 类型
}

为代码添加 JSDoc 注释使得阅读和理解代码更加方便(代码交接时再也不用抓狂了,当然前提是注释写得好),也保障了开发时的体验并且降低了很多运行时才能发现的数据类型方面的 bug。VSCode 基本支持 JSDoc 的常见语法,具体使用可参见JSDoc support in JavaScript。

基于 TypeScript 类型声明文件

除了使用 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,不过无伤大雅):

如何为你的JS项目添加智能提示与类型检查详解

对于自己的代码,可以编写对应的 ts 类型声明文件,而对于引用的第三方库,社区同样提供了解决方案:DefinitelyTyped 提供了常见的第三方库的类型声明文件。VSCode 有很多第三方库已经内置类型声明文件,自己下载的话直接使用 npm 即可:

# @types + 第三方库名称
npm i @types/express

关于 ts 类型声明文件的语法等相关信息,参见官网介绍。

另外,在 VSCode 中,类型检查并非默认开启,这意味着即使你有详尽的 JSDoc 注释或 ts 类型声明文件,依然可能在数据类型上栽跟头。开启方式为在项目根目录下添加 jsconfig.json 文件,并设置 "checkJs": true,示例如下:

{
 "compilerOptions": {
  "checkJs": true
 },
 
 // 位于此目录下的文件不进行静态检查和智能提示
 "exclude": [
  "node_modules",
  "**/node_modules/*"
 ]
}

总结

最后,无论是对老项目的改造或是新项目的开发,使用以上的方式添加智能提示和类型检查显而易见会略微拖慢开发速度,但我们认为,与智能提示带来的开发体验、将很多可能在运行时才能发现的错误通过类型检查前置解决、顺手完成的详细文档以及重构代码时的信心相比,这点速度的牺牲是值得的。

好了,以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,谢谢大家对三水点靠木的支持。

参考文档:

  • JavaScript in Visual Studio Code
  • Working with JavaScript
  • JavaScript Language Service in Visual Studio
Javascript 相关文章推荐
js确定对象类型方法
Mar 30 Javascript
jQuery实现简单网页遮罩层/弹出层效果兼容IE6、IE7
Jun 16 Javascript
javascript使用正则控制input输入框允许输入的值方法大全
Jun 19 Javascript
在父页面得到zTree已选中的节点的方法
Feb 12 Javascript
jQuery实现点击按钮文字变成input框点击保存变成文字
May 09 Javascript
微信小程序 LOL 英雄介绍开发实例
Sep 30 Javascript
使用vue和datatables进行表格的服务器端分页实例代码
Jun 07 Javascript
详解Vue组件之间的数据通信实例
Jun 17 Javascript
vue表单绑定实现多选框和下拉列表的实例
Aug 12 Javascript
JS写谷歌浏览器chrome的外挂实例
Jan 11 Javascript
Vue引入sass并配置全局变量的方法
Jun 27 Javascript
vue响应式系统之observe、watcher、dep的源码解析
Apr 09 Javascript
Vue项目引发的「过滤器」使用教程
Mar 12 #Javascript
通过JS运行机制的角度说说作用域
Mar 12 #Javascript
Jquery的autocomplete插件用法及参数讲解
Mar 12 #jQuery
如何使用pm2快速将项目部署到远程服务器
Mar 12 #Javascript
详解用Webpack与Babel配置ES6开发环境
Mar 12 #Javascript
详解微信小程序框架wepy踩坑记录(与vue对比)
Mar 12 #Javascript
javascript中数组的常用算法深入分析
Mar 12 #Javascript
You might like
Nginx下配置codeigniter框架方法
2015/04/07 PHP
Thinkphp实现自动验证和自动完成
2015/12/19 PHP
浅谈PHP中pack、unpack的详细用法
2018/03/12 PHP
Javascript - HTML的request类
2007/01/09 Javascript
利用jquery.qrcode在页面上生成二维码且支持中文
2014/02/12 Javascript
jQuery ajax全局函数处理session过期后的ajax跳转问题
2016/06/03 Javascript
canvas实现爱心和彩虹雨效果
2017/03/09 Javascript
js实现抽奖效果
2017/03/27 Javascript
jQuery实现鼠标滑过预览图片大图效果的方法
2017/04/26 jQuery
vue与bootstrap实现时间选择器的示例代码
2017/08/26 Javascript
three.js加载obj模型的实例代码
2017/11/10 Javascript
webpack+vuex+axios 跨域请求数据的示例代码
2018/03/06 Javascript
解决vue elementUI 使用el-select 时 change事件的触发问题
2020/11/17 Vue.js
[02:37]TI8勇士令状不朽珍藏II视频展示
2018/06/23 DOTA
[01:08:48]LGD vs OG 2018国际邀请赛淘汰赛BO3 第三场 8.25
2018/08/29 DOTA
深入解析Python设计模式编程中建造者模式的使用
2016/03/02 Python
Python+Selenium+PIL+Tesseract自动识别验证码进行一键登录
2017/09/20 Python
Python自动化之数据驱动让你的脚本简洁10倍【推荐】
2019/06/04 Python
Python使用正则表达式分割字符串的实现方法
2019/07/16 Python
python运用sklearn实现KNN分类算法
2019/10/16 Python
flask框架渲染Jinja模板与传入模板变量操作详解
2020/01/25 Python
使用Python爬虫库requests发送表单数据和JSON数据
2020/01/25 Python
五分钟学会怎么用python做一个简单的贪吃蛇
2021/01/12 Python
英国最大的女士服装零售商:Bonmarché
2017/08/17 全球购物
美国环保婴儿用品公司:The Honest Company
2017/11/23 全球购物
编码实现字符串转整型的函数
2012/06/02 面试题
工程造价专业大学生自荐信
2013/10/01 职场文书
《雪地里的小画家》教学反思
2014/02/22 职场文书
《小儿垂钓》教学反思
2014/02/23 职场文书
《在山的那边》教学反思
2014/02/23 职场文书
市场部经理岗位职责
2014/04/10 职场文书
客房部经理岗位职责
2015/02/02 职场文书
小组口号霸气押韵
2015/12/24 职场文书
学习型家庭事迹材料(2016精选版)
2016/02/29 职场文书
Pycharm 如何设置HTML文件自动补全代码或标签
2021/05/21 Python
Java界面编程实现界面跳转
2022/06/16 Java/Android