静态代码错误提示
在之前的《静态代码类型提示》文章中,我逆向了基本的类型提示功能,五一期间我又闲着无聊,又逆向了错误提示功能。下面是基本功能展示,基于个人的喜好问题,样式调整的比较花里胡哨,希望大伙见谅。
§功能展示
- 1
- 2
- 3
- 4
- 5
-
- 6
- 7
-
-
- 8
- 9
- 10
-
- 11
§原理讲解
其实整体功能还是从之前的语言服务延申出来的,能说的内容不多,我只是想水篇博文。
§获取错误数据
语言服务的初始化等内容请看《静态代码类型提示》,错误数据毫无疑问也是从语言服务中拿出来的,这里我们需要使用另外的几个接口来拿数据。
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- ;
- /** 需要检查的文件路径 */
- ;
- /** 语言服务 */
- ;
- ;
- ;
-
-
-
-
-
-
- ;
最后得到的rawScriptDiagnostics
数组即是当前文件的所有错误数据,诊断数据的类型还是很清晰的,都能望文生义。
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- ;
-
-
-
-
-
-
-
-
-
-
§格式化错误文本
上面的数据结构只有一项是比较麻烦的,那就是messageText
数据,我们可以看到它可以是字符串,也可以是DiagnosticMessageChain
接口,后者接口对应的是多行错误。
- 1
- 2
-
-
- 3
-
- [TS2339] Property 'toLowerCase' does not exist on type 'string | number'.
- Property 'toLowerCase' does not exist on type 'number'.
这个例子中我们可以看到,input.toLowerCase()
方法的错误信息有两行,这是因为类型诊断数据是由Token定义由内向外的,这样更能展示出完整的信息,方便编码者判断错误内容。
在类似多行的错误时,messageText
属性就会是DiagnosticMessageChain
接口,可以来看看它的结构——
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
-
-
-
-
-
-
-
-
DiagnosticMessageChain
接口就像是链表一样,使用next
属性将所有错误都串联了起来,而且每个数据还可以链接多个数据,这个结构着实有点复杂,如果是我们自己手写formatter
的话,需要费一番功夫。然而这其实不用担心!其实 TS 也是考虑了这点的,官方有提供格式化的方法——
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- ;
- ;
-
-
-
- ;
- /** 格式化的错误文本 */
-
- ;
第4
和12
行的高亮就是这个格式化方法的用法,这里仍然需要个格式化方法的Host
实体,不过内容并不多,只需要提供换行、文件名格式化方法、当前工作路径三个参数即可,可以按照自己语言服务的情况来提供。
§详细错误解释
很多时候,我们即便是看了具体的错误仍然不知道这错误是啥意思……TS 官网也没给每个错误的对应表。于是我找了个开源网站,对每个Error Code
做了个跳转,每个错误文本开头的[TS数字]
符号都是可以直接点击跳转到对应的错误解释,还是很方便的。