1、使用官方腳手架構建
新的 VueCLI
工具允許開發者 使用 TypeScript
集成環境 創建新項目。
只需運行 vue createmy-app
。
然后,命令行會要求選擇預設。使用箭頭鍵選擇 Manuallyselectfeatures
。
接下來,只需確保選擇了 TypeScript
和 Babel
選項,如下圖:
完成此操作后,它會詢問你是否要使用 class-style component syntax
。
然后配置其余設置,使其看起來如下圖所示。
Vue CLI工具現在將安裝所有依賴項並設置項目。
接下來就跑項目啦。
總之,先跑起來再說。
2、項目目錄解析
通過 tree
指令查看目錄結構后可發現其結構和正常構建的大有不同。
這里主要關注 shims-tsx.d.ts
和 shims-vue.d.ts
兩個文件
兩句話概括:
-
shims-tsx.d.ts
,允許你以.tsx
結尾的文件,在Vue
項目中編寫jsx
代碼 -
shims-vue.d.ts
主要用於TypeScript
識別.vue
文件,Ts
默認並不支持導入vue
文件,這個文件告訴ts
導入.vue
文件都按VueConstructor<Vue>
處理。
此時我們打開親切的 src/components/HelloWorld.vue
,將會發現寫法已大有不同
至此,准備開啟新的篇章 TypeScript
極速入門 和 vue-property-decorator
3. Vue組件的 Ts寫法
從 vue2.5 之后,vue 對 ts 有更好的支持。根據官方文檔,vue 結合 typescript ,有兩種書寫方式
Vue.extend
vue-class-component
理想情況下, Vue.extend
的書寫方式,是學習成本最低的。在現有寫法的基礎上,幾乎 0 成本的遷移。
但是 Vue.extend
模式,需要與 mixins
結合使用。在 mixin 中定義的方法,不會被 typescript 識別到
,這就意味着會出現丟失代碼提示、類型檢查、編譯報錯等問題。
菜鳥才做選擇,大佬都挑最好的。直接講第二種吧:
4.1 vue-class-component
我們回到 src/components/HelloWorld.vue
有寫過 python
的同學應該會發現似曾相識:
-
vue-property-decorator
這個官方支持的庫里,提供了函數 裝飾器(修飾符)語法
1. 函數修飾符 @
“@”,與其說是修飾函數倒不如說是引用、調用它修飾的函數。
或者用句大白話描述: @
: "下面的被我包圍了。"
舉個栗子,下面的一段代碼,里面兩個函數,沒有被調用,也會有輸出結果:
直接運行,輸出結果:
上面代碼可以看出來:
-
只定義了兩個函數:
test
和func
,沒有調用它們。 -
如果沒有“@test”,運行應該是沒有任何輸出的。
但是,解釋器讀到函數修飾符“@”的時候,后面步驟會是這樣:
1、去調用 test
函數, test
函數的入口參數就是那個叫“ func
”的函數;
2、test
函數被執行,入口參數的(也就是 func
函數)會被調用(執行);
換言之,修飾符帶的那個函數的入口參數,就是下面的那個整個的函數。有點兒類似 JavaScrip
t里面的 functiona(function(){...});
2. vue-property-decorator
和 vuex-class
提供的裝飾器
vue-property-decorator
的裝飾器:
-
@Prop
-
@PropSync
-
@Provide
-
@Model
-
@Watch
-
@Inject
-
@Provide
-
@Emit
-
@Component
(provided by vue-class-component) -
Mixins
(the helper function namedmixins
provided by vue-class-component)
vuex-class
的裝飾器:
-
@State
-
@Getter
-
@Action
-
@Mutation
我們拿原始Vue組件模版來看:
以上模版替換成修飾符寫法則是:
正如你所看到的,我們在生命周期 列表那都添加 privateXXXX
方法,因為這不應該公開給其他組件。
而不對 method
做私有約束的原因是,可能會用到 @Emit
來向父組件傳遞信息。
4.2 添加全局工具
引入全局模塊,需要改 main.ts
:
npm iVueI18n
但僅僅這樣,還不夠。你需要動 src/vue-shim.d.ts
:
之后使用 this.$i18n()
的話就不會報錯了。
4.3 Axios 使用與封裝
1. 新建文件 request.ts
文件目錄:
2. request.ts
文件解析
為了方便,我們還需要定義一套固定的 axios 返回的格式,新建 ajax.ts
:
3. main.ts
接口調用:
4、編寫一個組件
為了減少時間,我們來替換掉 src/components/HelloWorld.vue
,做一個博客帖子組件:
然后在 Home.vue
中使用:
這時候運行項目
這就是簡單的父子組件
5、參考文章
TypeScript — JavaScript with superpowers — Part II
VUE WITH TYPESCRIPT
TypeScript + 大型項目實戰
Python修飾符 (一)—— 函數修飾符 “@”
Typescript 中的 interface 和 type到底有什么區別