由于 JS 的弱类型、宽松的编写规范、以及开发工具的弱鸡支持,我们在维护前人的代码时,经常会出现不知道某一个方法或字段命名来自于哪里,一定要在全局搜索以后慢慢筛查才能找到

同样我们在使用接口返回的对象字段时,也不知其类型几何,意思几何

甚至在我们使用挂载到 vue 全局对象上的方法时,纯粹靠猜,尤其是当函数可以接收多种类型的时候,很痛苦

为此,我在近三个月的项目开发中做了以下的实验和改进

先说目的:我们希望一切资源皆可索引到其定义或来源,可以有代码补全,在vscodectr+鼠标左键皆可导航到,提高效率,用的爽

具体配置信息

配置全局jsconfig.json

我们习惯在wepback内配置相关路径别名,为了让vscode识别,我们需要做如下配置

{
"compilerOptions": {
"target": "ES6",
"module": "commonjs",
"allowSyntheticDefaultImports": true,
"baseUrl": "./",
"paths": {
"@/*": ["src/*"]
}
},
"exclude": ["node_modules", "dist"],
"include": ["src/**/*", "global.d.ts"]
}

安装插件vue-helper

安装该插件是为了解决vscode-intelligence不识别.vue文件,进而无法导航的问题

不过依然存在bug,如果import x变量名不和file-name相同,则无法识别。

终极解决方案是对 .vue文件进行js托管

export { default } from './index.vue'

vscode可以一步完美导航到具体页面

讨厌写重复代码?定义个 snippet

  "export default": {
"scope": "javascript,typescript",
"prefix": "expd", "body": ["export {default} from './index.vue${1}';"]
},
"export default as": {
"scope": "javascript,typescript",
"prefix": "expdas", "body": ["export {default as ${2}} from './index.vue${1}';"]
},

为挂在到Vue上的方法或属性添加类型声明

根目录下新建global.d.ts, 并添加至jsconfig.json: include

// global.d.ts
import Vue from 'vue'
type FnVoid = (...ags: any[]) => void declare module '*.vue' {
export default Vue
}
declare module 'vue/types/vue' {
interface Vue {
$$title: (title: string) => void
$$login: FnVoid
// ......
}
}

写正确的注释

vscode现今对 jsdoc语法的支持愈发完善,在代码编写代码阶段可以给我们强大的代码提示代码补全以及代码检查

比如我们可以在注释内定义变量,针对列表返回的接口,且不需要定义 model 对象来承接数据的话,自定义变量就很有用了

甚至于还支持import语法

不过,不依附于方法之上的注释变量是不可用的

比如我新建一个文件,并写入以下注释

/**
* @typedef {Object} person
* @property {string} name
* @property {number} age
*/

在代码内是无法引用的

/**@type import('./test').person */

我觉得都已经到了抽象对象多处复用的地步了,为什么不直接在model层下新建对象呢

估计vscode也是基于此考虑的

另外对象如果是通过计算得来的,vscode 代码提示功能也无法识别

如下代码是不能针对对象属性进行提示的

我们在编写代码中尽量避免这种写法

const func = () => {
return ['a', 'b', 'c'].reduce((pre, cur) => {
pre[cur] = 'hello ' + cur
return pre
}, {})
} let obj = func()

Advanced

如果我们想在代码中对事件定义添加提示怎么办呢?

比如我注册了一个事件

test.on('handleInputClicked', () => {})

很遗憾,目前在jsdoc上还做不到

可喜的是,在最新发布的ts4.1.beta上增加了对类型模板字符串的支持

基于此,我们甚至可以实现对 vuex 的支持

具体的文档参见TypeScript 4.1 类型模板字符串实现 Vuex 的 store.commit 和 store.dispatch 类型判断

不用typsescript也能使用类型增强功能的更多相关文章

  1. WPF4.5 中的新增功能和增强功能的信息

    本主题包含有关 Windows Presentation Foundation (WPF) 版本 4.5 中的新增功能和增强功能的信息. 本主题包含以下各节: 功能区控件 改善性能,当显示大时设置分组 ...

  2. 安装virtualbox虚拟机的增强功能

    转自:http://wubangtu.com/714 最近有很多人问我这个问题,现在全部写在这里,免得到时候又啰嗦一遍了,哈哈.欢迎大家前来围观: 安装virtualbox虚拟机的增强功能可以实现如下 ...

  3. C++笔记十二:C++对C的扩展——struct关键字类型增强

    C语言的struct定义了一组变量的集合,C编译器并不认为这是一种新的类型. C++中的struct是一个新类型的定义声明. struct Student { char name[100]; int  ...

  4. Linux 环境下为VirtualBox安装增强功能

    VirtualBox安装CentOS后,再安装增强功能就可以共享文件夹.粘贴板以及鼠标无缝移动,主要步骤如下: 1.yum -y update 2.yum -y install g++ gcc gcc ...

  5. CentOS 5.5 虚拟机安装 VirtualBox 客户端增强功能

    .启动安装在 VirtualBox 中的 CentOS 5.5 虚拟机,点击“设备” => “安装增强功能”.这个时候你就可以看到有一个“光盘”已经挂载到 CentOS 5.5 的桌面上了.它包 ...

  6. C/C++(C++类型增强)

    C++类型增强 类型检查更严格 把一个const类型的指针赋给非const类型的指针.c语言中可以通的过,但是在c++中则编不过去 const int a = 10; a = 100;//const修 ...

  7. Python 命令行之旅:深入 click 之增强功能

    作者:HelloGitHub-Prodesire HelloGitHub 的<讲解开源项目>系列,项目地址:https://github.com/HelloGitHub-Team/Arti ...

  8. virtualbox安装增强功能时【未能加载虚拟光盘】

    virtualbox安装增强功能时[未能加载虚拟光盘] 今天在使用Virtualbox中的Ubuntu虚拟机,想安装增强功能来实现更改分辨率,但是在安装时出错:未能加载虚拟光驱 VBoxsGuestA ...

  9. virtualbox安装增强功能(centos6.5)

    vitualbox安装增强功能(centos 6.5) 1. 安装依赖包 #yum install kernel-headers-$(uname -r) #yum install kernel-dev ...

随机推荐

  1. Codeforces Round #697 (Div. 3) D. Cleaning the Phone (思维,前缀和)

    题意:你的手机有\(n\)个app,每个app的大小为\(a_i\),现在你的手机空间快满了,你需要删掉总共至少\(m\)体积的app,每个app在你心中的珍惜值是\(b_i\),\(b_i\)的取值 ...

  2. Manacher算法 & Palindrome

    马拉车用于解决最长回文子串问题,重点是子串,而不是子序列,时间复杂度为O(n). 解释一下变量的意义: Len[i]数组去存第i个位置到mx位置的长度 id记录上一次操作的位置(这个操作可以看模板) ...

  3. 二分图最大权匹配问题&&KM算法讲解 && HDU 2255 奔小康赚大钱

    作者:logosG 链接:https://www.cnblogs.com/logosG/p/logos.html (讲解的KM算法,特别厉害!!!) KM算法: 现在我们来考虑另外一个问题:如果每个员 ...

  4. SQL Server 新安装启用sa用户/sa用户登录提示管道另一端无进程

    安装时只用windows验证 安装完成后: 首先选中服务器(右键)->属性->安全性->服务器身份验证修改为"SQL SERVER和WINDOWS身份验证模式"其 ...

  5. 基于用户的协同过滤的电影推荐算法(tensorflow)

    数据集: https://grouplens.org/datasets/movielens/ ml-latest-small 协同过滤算法理论基础 https://blog.csdn.net/u012 ...

  6. 编写一个c函数,该函数给出一个字节中被置为1的位的个数

    请编写一个c函数,该函数给出一个字节中被置为1的位的个数 #include <stdio.h> void fun(char ch) { int i; int temp; int count ...

  7. SpringBoot进阶教程(七十)SkyWalking

    流行的APM(Application Performance Management工具有很多,比如Cat.Zipkin.Pinpoint.SkyWalking.优秀的监控工具还有很多,其它比如还有za ...

  8. JavaScript for, for...in, for...of, for-await...of difference All In One

    JavaScript for, for...in, for...of, for-await...of difference All In One for for...in for...of for-a ...

  9. Flutter CLI commands All In One

    Flutter CLI commands All In One Flutter run key commands. r Hot reload. R Hot restart. h Repeat this ...

  10. HTMLMediaElement.srcObject & URL.createObjectURL & HTMLMediaElement.src

    HTMLMediaElement.srcObject & URL.createObjectURL & HTMLMediaElement.src Uncaught TypeError: ...