如今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
第一篇分享就到這。
有興趣的能夠繼續往下看