如今2019年了,TypeScript愈来愈火,由于更多的人认识到了TypeScript的好处,一直写一直爽。javascript
那用TypeScript开发项目后的优势在哪里尼?html
这些理由,应该有不少人会反对,你们都认为用js写项目,同样也能够实现上述理由,其余人作不到那是写的人不行,这个认知,我大部分也同意,可是咱们须要考虑现状。前端
这就是大部分团队的现状,项目越大,后期维护成本就越高,那为啥TypeScript能够下降这些问题发生的几率,或者缩小问题的规模尼。vue
若是项目是全新的,有两种方式: 一种是vue官方的教程,全部的配置都是基于vue-cli全家桶来作的,开箱就能用;一种是微软出的教程,适合工程化有必定定制需求的团队。java
如下是vue官方的教程node
用【vue ui】命令时就建立项目,能够直接选TypeScript。 react
用【vue create my-project-name 】建立时命令行选择 git
vue官方教程 cn.vuejs.org/v2/guide/ty…程序员
目前公司用的vue-cli搭建的项目,工程化文件都是vue默认提供的,微软的就不介绍了,有兴趣的能够去看看github
微软官方vue+ts教程: github.com/Microsoft/T…
若是项目已经存在,须要额外添加TypeScript的支持,vue官方也提供了支持,github.com/vuejs/vue-c…
vue add typescript
复制代码
这个命令会自动把js项目转换成ts,自动为项目的package.json,加上相关的的依赖
记得把vue-class-component、vue-property-decorator升级下,默认的版本有点低
"vue-class-component": "^7.0.2",
"vue-property-decorator": "^8.1.0",
复制代码
升级完,建议修改下vue.config.js的配置
const path = require("path");
configureWebpack: config => {
config.resolve.modules.push(path.resolve(__dirname, "src"));
}
复制代码
这是为了更好读取src下的目录,虽然vue.config.js 提供了src默认的alias => @,可是vue升级到vue3.0,在vs-code下,找组件关系依赖时,用@时,不是很方便,这是以前写react时碰到的坑吧。
由于在VueConstructor下是没有定义store这个属性,因此致使了这个错误
// main.ts
...
Vue.store = store;
...
复制代码
既然知道了缘由,那么修改下全局的VueConstructor这个就行了
// shims-vue.d.ts
import Vue, { ComponentOptions } from "vue";
import { Store } from "vuex";
declare module "vue/types/vue" {
interface VueConstructor {
store: Store<any>;
}
}
复制代码
再次编译,发现已经没有问题了。
若是是全新的项目按照官方生成的应该是没有问题 ,可是已有的项目,由于历史 缘由应该有不少lint规则和已有的lint规则不一致,致使报错,要一个个 修改也是麻烦,并且有些是没有办法立马修改的,好比说下面这种
<!-- eslint-disable max-lines -->
// 新的lint规则,不识别这种标识符。
····
// 路由规则
component: {
render: h => (
<keep-alive include="noticeIndex">
// 没有开启jsx的功能,致使lint出错
<router-view />
</keep-alive>
)
}
复制代码
还有就是一些历史的js共通函数,这些均可能过不了新的lint规则,要一个个修正也麻烦,那怎么解决尼?
有三种方式
直接上代码
// .eslintrc
"overrides": [
{
"files": ["*.vue"],
"parserOptions": {
"ecmaFeatures": {
"jsx": true
}
}
}
]
// tsconfig.json
"exclude": ["node_modules", "dist", "src/main.ts"]
复制代码
具体错误咱们看图
在run server时,控制台也会报错
虽然控制台和IDE都报错了,可是这个并不影响页面的开发,只不过一堆的错误,放在控制台确定很差看,Google了下发现也没有特别好的解决方案,vue官方有一个issue,用// @ts-ignore 标识符忽略掉,只不过这个标识符每次只能忽略一行,若是在router组件内,有一堆的import,就很麻烦了。
vue官方issue: Typescript: IDE reports TS2307: Cannot find module error for Vue components imports
顺着TypeScript的@ts-ignore线索,看看能不能一次性写一个标识符,好比下面这样
@ts-ignore-start
@ts-ignore-end
@ts-ignore-all
@ts-ignore-file
复制代码
看着是否是很机智,哈哈,这是一个还在讨论的issue,上面都是issue的建议,你们有时间去能够跟下帖子,蛮有意思的。
TypeScript 官方issue: @ts-ignore for the block scope and imports
第一篇分享就到这。
有兴趣的能够继续往下看