使用 typescript ,提升 vue 項目的開發體驗(1)

此文已由作者張漢銳授權網易云社區發布。

歡迎訪問網易云社區,了解更多網易技術產品運營經驗。


前言:對于我們而言,typescript 更像一個工具


官方指南

從 vue2.5 之后,vue 對 ts 有更好的支持。根據官方文檔,vue 結合 typescript ,有兩種書寫方式:


Vue.extend

??import?Vue?from?'vue'const?Component?=?Vue.extend({????//?type?inference?enabled})


Class-style Vue Components

??import?Vue?from?'vue'import?Component?from?'vue-class-component'//?The?@Component?decorator?indicates?the?class?is?a?Vue?component@Component({????//?All?component?options?are?allowed?in?heretemplate:?'<button?@click="onClick">Click!</button>'})export?default?class?MyComponent?extends?Vue?{????//?Initial?data?can?be?declared?as?instance?propertiesmessage:?string?=?'Hello!'//?Component?methods?can?be?declared?as?instance?methodsonClick?():?void?{??????window.alert(this.message)}}


理想情況下,Vue.extend 的書寫方式,是學習成本最低的。在現有寫法的基礎上,幾乎 0 成本的遷移

//?現在常見的寫法export?default?{????//?your?code?}


但「理想豐滿,現實骨感」,問題出在:


  • Vue.exend 在和 vuex 和 mixins 結合使用的時候,無法發揮 ts 的作用,vuex 和 mixins 會在項目中大量使用,這個問題不能忽視。


Vue.extend + vuex + mixins 問題的介紹


Vue.extend + vuex 的問題

由于 vuex 使用 ?mapState, mapActions 等方法的時候,通過字符串形式做映射,這個過程中,丟失了類型信息。下面的 gif 可以看到,整個過程中:

  • 無法做代碼提示

  • 無法對對應的 actions ?和 state 做類型聲明,使得類型檢查生效

  • 無法使用重構

    Alt pic


顯然,如果只有一部分的方法和屬性得到了代碼提示和類型檢查,就是失去了使用 typescript 意義。

在 Vue.extend + vuex 寫法下,這個問題暫時沒有解決方案。


Vue.extend + mixins 的問題

同樣的問題,在 mixin 中定義的方法,不會被 typescript 識別到,下面 gif 可以看到,不僅僅「代碼提示」「類型檢查」「代碼重構」沒有工作,甚至因識別不到 test 而報錯

Alt pic


Alt pic


Class-Style Components


那么就剩下 Class-Style Components 方案。當然,這個方案需要做額外的工作才能夠讓「vue 全家桶 + ts」良好的工作。

原理:將屬性直接掛載在 class 上,使得 typescript 能夠良好的進行「代碼提示」和「類型檢查」。然后再通過裝飾器將屬性轉成 vue 上的屬性。


例如 @Prop, @Watch, @Action 等裝飾器,將屬性做相應的轉換成 props, ?watch, mapActions 里面的值,具體后面例子展示。


vue-class-component


這里庫提供最基礎的 vue 裝飾器:@Component 。其他的 vue 裝飾器庫,都在這個庫的基礎上做擴展和修改。看看官網的例子:


import?Vue?from?'vue'import?Component?from?'vue-class-component'//?@Component?會將?MyComponent?中的屬性,轉換成?vue?對應的屬性@Component({??//?Vue?所有的屬性都可以在這里聲明,一般用到的比較少template:?'<button?@click="onClick">Click!</button>'})
export?default?class?MyComponent?extends?Vue?{??//?@Component?將?message?轉成成?data?message:?string?=?'Hello!'//?@Component?會將這里的?getter?屬性,轉換成?computedget?name(){????return?'anders'}??//?@Component?識別到?created?是聲明周期關鍵字,不做處理created(){}??//?@Component?識別到?onClick?不是關鍵字,將它轉成?methods??onClick?():?void?{????window.alert(this.message)}
}


vue-property-decorator


這個庫提供了:


  • @Emit

  • @Inject

  • @Model

  • @Prop

  • @Provide

  • @Watch


其中常用的: @Prop,@Watch,@Emit。 看例子:


import?{?Component,?Emit,?Inject,?Model,?Prop,?Provide,?Vue,?Watch?}?from?'vue-property-decorator'const?s?=?Symbol('baz')@Component
export?class?MyComponent?extends?Vue?{@Emit()addToCount(n:?number){?this.count?+=?n?}@Emit('reset')resetCount(){?this.count?=?0?}@Prop()propA:?number@Prop({?default:?'default?value'?})propB:?string@Prop([String,?Boolean])propC:?string?|?boolean@Watch('child')onChildChanged(val:?string,?oldVal:?string)?{?}@Watch('person',?{?immediate:?true,?deep:?true?})onPersonChanged(val:?Person,?oldVal:?Person)?{?}
}


上面的使用就相當于:


const?s?=?Symbol('baz')export?const?MyComponent?=?Vue.extend({name:?'MyComponent',props:?{checked:?Boolean,propA:?Number,propB:?{type:?String,??????default:?'default?value'},propC:?[String,?Boolean],},methods:?{addToCount(n){??????this.count?+=?n??????this.$emit("add-to-count",?n)},resetCount(){??????this.count?=?0this.$emit("reset")},onChildChanged(val,?oldVal)?{?},onPersonChanged(val,?oldVal)?{?}},watch:?{????'child':?{handler:?'onChildChanged',immediate:?false,deep:?false},????'person':?{handler:?'onPersonChanged',immediate:?true,deep:?true}}
})


更加全面的用法參考文檔:vue-property-decorator


免費體驗云安全(易盾)內容安全、驗證碼等服務

更多網易技術、產品、運營經驗分享請點擊。


相關文章:
【推薦】?年輕設計師如何做好商業設計

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/253124.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/253124.shtml
英文地址,請注明出處:http://en.pswp.cn/news/253124.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Linux進程間通信——使用共享內存

//本文轉載http://blog.csdn.net/ljianhui/article/details/10253345下面將講解進程間通信的另一種方式&#xff0c;使用共享內存。一、什么是共享內存顧名思義&#xff0c;共享內存就是允許兩個不相關的進程訪問同一個邏輯內存。共享內存是在兩個正在運行的進程之間共享和傳遞…

laravel擴展包開發步驟總結

1. 創建包1php artisan workbench vendor/package --resources注: vendor:開發商名 package:包名2.修改下包里composer.json中的authors123456"authors": [{"name": "cicl","email": "test126.com"}]3. 為創建的包注冊Se…

洛谷 P1340 獸徑管理

題目描述 約翰農場的牛群希望能夠在 N 個(1<N<200) 草地之間任意移動。草地的編號由 1到 N。草地之間有樹林隔開。牛群希望能夠選擇草地間的路徑&#xff0c;使牛群能夠從任一 片草地移動到任一片其它草地。 牛群可在路徑上雙向通行。 牛群并不能創造路徑&#xff0c;但是…

功放關鍵規格參數檢查

編號規格備注1功放類型(開環/閉環)影響電性能指標2工作電壓(V)影響IC的穩定性3最大耐壓(V)影響IC的穩定性4最小負載(ohm)穩定性&#xff0c;過流&#xff0c;輸出功率&#xff0c;散熱5輸出功率過流&#xff0c;輸出功率&#xff0c;散熱6輸出方式(SE/BTL/PBTL)輸出功率&#x…

不踩雷不將就 京東智能產品30天無憂退

剁手節已經來臨&#xff0c;鋪天蓋地的促銷信息讓人應接不暇&#xff0c;恰好又是換季&#xff0c;確實需要買買買一波了。各種滿減活動讓人眼花繚亂&#xff0c;這波堪稱全年最大力度的促銷活動&#xff0c;令人是又喜又怕。倘若之前踩過雷的朋友&#xff0c;必然現在會謹慎許…

Linux進程間通信——使用信號量

//轉自http://blog.csdn.net/ljianhui/article/details/10243617 這篇文章將講述別一種進程間通信的機制——信號量。注意請不要把它與之前所說的信號混淆起來&#xff0c;信號與信號量是不同的兩種事物。有關信號的更多內容&#xff0c;可以閱讀我的另一篇文章&#xff1a;L…

麥克風陣列音頻檢查方法和標準

為確保產品能夠符合算法要求&#xff0c;務必提前做好相關設計&#xff0c;盡量確保各項指標滿足如下標準。 音頻評測工作&#xff0c;主要集中在研發設計階段&#xff1b;針對產品形態的不同&#xff0c;測試可分為裸板測試和整機測 試&#xff0c;下表為不同階段需要測試的…

Linux下git的使用——將已有項目放到github上

本地已經有一個項目了&#xff0c;需要將該項目放到github上&#xff0c;怎么操作&#xff1f; 步驟&#xff1a; 本地安裝git&#xff0c;有github賬號是前提。 &#xff08;1&#xff09;先在github創建一個空的倉庫&#xff0c;并復制鏈接地址。使用https&#xff0c;以.git…

SVG格式圖片轉成HTML中SVG的Path路徑

AI圖標制作完成之后&#xff0c;保存的svg文件包含許多AI的信息&#xff0c;如果要在HTML中使用&#xff0c;我們需要在svg文件中提取/修改信息&#xff0c;重新保存。 1、在AI中已經完成圖標&#xff0c;要保存SVG文件&#xff0c;點擊“文件(File)”-“另存為(Save As)”&…

11-5 筆記

函數&#xff1a; 函數在調用的時候&#xff0c;會形成一個私有作用域&#xff0c;內部的變量不會被外面訪問&#xff0c;這種保護機制叫閉包。這就意味著函數調用完畢&#xff0c;這個函數形成的棧內存會被銷毀。 函數歸屬誰跟它在哪調用沒有關系&#xff0c;跟在哪定義有關。…

linux下socket連接下的心跳機制

1&#xff0c;在長連接下&#xff0c;有可能很長一段時間都沒有數據往來。 理論上說&#xff0c;這個連接是一直保持連接的&#xff0c;但是實際情況中&#xff0c;如果中間節點出現什么故障是難以知道的。 有的節點&#xff08;防火墻&#xff09;會自動把一定時間之內沒有數…

大力智能臺燈與飛利浦臺燈 智能調光功能體驗

目前市面上絕大部分智能臺燈幾乎都宣稱有自動調光功能&#xff0c;即臺燈隨環境光變化自動調節LED光的亮度&#xff0c;或者臺燈在固定環境光下&#xff0c;一旦開啟了自動調光模式LED燈將自動調光至一個最適合讀寫作業的亮度&#xff1b; 下面對比體驗了大力臺燈T6 和 飛利浦…

php-驗證碼

<html><body> <h2>用戶注冊&#xff1a;</h2> <br> <form action"a.php" method"post"> 賬 號&#xff1a;<input type"text" name"zh" id""> <br> 密 碼&#xff1a;&l…

Linux內核Socket參數調優

可調優的內核變量存在兩種主要接口&#xff1a;sysctl命令和/proc文件系統&#xff0c;proc中與進程無關的所有信息都被移植到sysfs中。IPV4協議棧的sysctl參數主要是sysctl.net.core、sysctl.net.ipv4&#xff0c;對應的/proc文件系統是/proc/sys/net/ipv4和/proc/sys/net/cor…

Mango 的組織重構

為了提高敏捷性&#xff0c;企業應將自己劃分為一些負責業務戰略計劃價值中心&#xff0c;承擔端到端的責任&#xff0c;并完全獲取有關客戶需求的信息。企業需要為員工營造可交叉協作的空間&#xff0c;可以學習和使用自組織的改進圈、實踐社群&#xff08;CoP&#xff0c;Com…

vue.js單頁面應用實例

一&#xff1a;npm的安裝由于新版的node.js已經集成了npm的環境&#xff0c;所以只需去官網下載node.js并安裝&#xff0c;安裝完成后使用cmd檢測是否成功。測試node的版本號&#xff1a;node -v測試npm的版本號&#xff1a;npm -v以上提示代表安裝成功二&#xff1a;vue.js環境…

大屏拼接控制器的發展歷程與現狀分析

【中國數字視聽網訊】在大屏幕拼接系統中&#xff0c;我們很容易將焦點聚集在拼接單元上&#xff0c;殊不知幕后還有一個英雄在默默的支持&#xff0c;這個英雄就是是拼接控制器。拼接控制器的優劣直接決定著整個大屏幕顯示系統效果的好與壞&#xff0c;也決定了整套顯示系統的…

AA級與AAA級臺燈 重要指標對比

讀寫作業臺燈&#xff0c;按照國家標準&#xff08;GB/T 9473-2017 讀寫作業臺燈性能要求 &#xff09;臺燈只有兩個等級 即為A級和AA級&#xff1a; 但是大家在各個購物網站挑選臺燈尤其是挑選孩子學習用的讀寫臺燈時&#xff0c;會發現很多廠家宣稱臺 燈為AAA級&#xff0c…

windbg調試相關命令

windbg查找函數:x exe!main*條件斷點打印字符&#xff1a;bp 7199a2b0 ".printf \"message:%ma\", poi(esp8);.echo;g"//搜索內存:s -a 0000000000780000 L8000000 "This is a test2"!address,可以查看進程的堆布局&#xff0c;堆屬性。!addre…

零基礎學python,看完這篇文章,你的python基礎就差不多了!干貨【1】

2019獨角獸企業重金招聘Python工程師標準>>> Python基礎語法和面向對象&#xff08;下一篇分享面向對象&#xff09; Python基礎語法 1. 認識Python 1.1 Python 簡介 Python 的創始人為吉多范羅蘇姆&#xff08;Guido van Rossum&#xff09;。 Python 的設計目標&a…