问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

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

发布网友 发布时间:2023-08-26 15:33

我来回答

1个回答

热心网友 时间:2023-09-04 04:23



前言


最近在做项目代码重构,其中有一个要求是为代码添加智能提示和类型检查。智能提示,英文为 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,不过无伤大雅):



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


# @types + 第三方库名称
npm i @types/express
关于 ts 类型声明文件的语法等相关信息,参见官网介绍。


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


{
"compilerOptions": {
"checkJs": true
},

// 位于此目录下的文件不进行静态检查和智能提示
"exclude": [
"node_moles",
"**/node_moles/*"
]
}
总结


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

好了,
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
...啊?我从嘴里吐出去是直的算过肺了吗?我不会从鼻子里出去_百度... 恶心呕吐是什么? 高考数学大题应注意哪些问题呢? 高考数学可不可以用高等数学啊 高考数学 基础知识点 常见考查方式 高考数学考什么内容 一般纳税人如何交所得税 以前的QQ忘记密码了那时候不要了就不找回密码了,现在想找回来,但是又没... 常州机场坐飞机流程 常州机场大巴时刻表 ...我早上九点起飞的飞机, 然后我这的机场快线大巴到机场时70分钟,_百 ... 这个配置玩gta5 1080分辨率,特效高,多少帧 gtx1080玩gta5多少帧 双路gtx1080玩gta5 4k分辨率 效果全高能稳定在多少帧? ps4pro玩gta5多少帧 一道物理题,九年级上,苏教版。 妈妈让丽丽背诵古诗80首如果丽丽每天三首他一个月按30天算能背完吗... 如果美丽是一朵花那么你就是一个花园的意思 抖音没打开私信通知,怎么发不过去私信呢!? 我用的WIN7系统,为什么每个快捷方式上都有一个安全图标啊,怎么去掉啊... ...小图标,每个图标上面都有,但能正常打开。WIN7系统!急!!! 投保现金红利的分红险种,客户可以选择哪些红利领取方式? 欢迎客人来学校参观英语 我是村委工作人员,前几天村委开了个党员学习班,学习科学发展观,请老师... 用德高望重,寝不安席,集思广益造句 学校禁毒宣传语 调整权限、规范审批、加强监管,宁波房地产开发企业资质管理进一步... 乌鲁木齐乌房蓝锦湾容积率是多少? 引起蛋白质的因素有哪些?变性后性质有哪些改变?在实质中有何作用 底滤仓可以养河豚嘛 纳米仓什么意思 怎么找到已删除好友 删了的好友忘记怎么找回来她删除? Excel表格如何让隐藏的列显示 买卖天猫的选店技巧有哪些 印弟安人的语言多种多样,大约多达一千七、八百种。标点符号使用正确吗... 北京东站到朝阳区双桥路金隅可乐做地铁怎么走 从北京站到双桥双柳北街39号多远、 双桥到北京东站怎么走 我最喜欢的书是《三国志》的翻译是:什么意思 汉书[hàn shū]什么意思?近义词和反义词是什么?英文翻译是什么? 意思[yì si]什么意思?近义词和反义词是什么?英文翻译是什么? gba三国志这是什么意思? 吴江区叶泽湖花苑有没有修理家用电器的 冰箱上面老结冰怎么办 华为G520恢复出厂设置初始密码多少?急急急!!! 华为g520联通版重启手机是什么画面,我的有时是沃3g,有时是华为的商标... 华为g520-t10手机为什么会一直自动重启 09年浙江高考理科310分能报什么学校?能上大专不? 燃气灶松手就灭原因燃气灶松手就灭解决方法 kw/rpm是什么意思