手寫(xiě)TypeScript?時(shí)很多人常犯的幾個(gè)錯(cuò)誤
前言
TypeScript 和 JavaScript 在過(guò)去幾年中不斷進(jìn)步,我們?cè)谶^(guò)去點(diǎn)時(shí)間中建立的一些實(shí)踐可能已經(jīng)過(guò)時(shí)。有些可能永遠(yuǎn)沒(méi)有意義,下面我列出了很多=開(kāi)發(fā)者可能會(huì)犯的幾個(gè)錯(cuò)誤!
1.沒(méi)有使用嚴(yán)格模式
通過(guò)使用沒(méi)有嚴(yán)格模式的 tsconfig.json。
使用嚴(yán)格模式后。
我們?yōu)槭裁匆褂脟?yán)格模式?
嚴(yán)格模式可以消除語(yǔ)法里一些不合理,不嚴(yán)謹(jǐn)?shù)牡胤?,可以讓TS往更合理、更安全、更嚴(yán)謹(jǐn)?shù)姆较蛉グl(fā)展: 通過(guò)將一些TS的靜默錯(cuò)誤更改為拋出錯(cuò)誤,消除了TS的一些靜默錯(cuò)誤,能更加有效保障代碼運(yùn)行的安全; 提高編譯器效率,增加運(yùn)行速度; 禁止一些可能在ECMAScript未來(lái)版本中定義的語(yǔ)法。
2. 使用 || 確定默認(rèn)值
那它應(yīng)該是什么樣子的呢?
使用最新的??
運(yùn)算符或者最好是在參數(shù)級(jí)別定義返回值。
這??
運(yùn)算符去年才被引入,如果在長(zhǎng)函數(shù)的中間使用值,可能很難將它們定義為參數(shù)默認(rèn)值。
?? 與 || 不同,它只返回 null 或 undefined,而不是所有 falsy 值。
3.使用any作為類型
當(dāng)我們不確定數(shù)據(jù)類型的時(shí)候,會(huì)使用any類型的數(shù)據(jù)。
在所有我們不確定類型的情況下,我們都應(yīng)該使用unknown。
為什么要這么做呢?
any 很簡(jiǎn)單,因?yàn)樗鼜母旧辖昧怂蓄愋蜋z查。通常,即使在官方類型中也使用 any(例如,上面示例中的 response.json() 被 TypeScript 團(tuán)隊(duì)鍵入為 Promise<any>
)。
為什么不能用any?
它從根本上禁用所有類型檢查。通過(guò) any 進(jìn)入的所有值都將完全放棄任何類型檢查。這可能會(huì)變得非常難以捕捉錯(cuò)誤,因?yàn)橹挥挟?dāng)我們對(duì)類型結(jié)構(gòu)的假設(shè)符合運(yùn)行時(shí)代碼時(shí),代碼才會(huì)失敗。
4. val 作為 SomeType
強(qiáng)制告訴編譯器它無(wú)法推斷的類型。
這就是類型守衛(wèi)的用途。
當(dāng)我們想要從 JavaScript 轉(zhuǎn)換為 TypeScript 時(shí),現(xiàn)有的代碼庫(kù)經(jīng)常對(duì) TypeScript 編譯器無(wú)法自動(dòng)得出的類型做出假設(shè)。在這些情況下,使用快速 as SomeOtherType 可以加快轉(zhuǎn)換速度,而無(wú)需放松 tsconfig 中的設(shè)置。
即使現(xiàn)在可以保存斷言,但當(dāng)有人移動(dòng)代碼時(shí),這可能會(huì)改變。類型保護(hù)將確保所有檢查都是明確的。
5. any在測(cè)試用例中的表現(xiàn)
在編寫(xiě)測(cè)試時(shí)
如果需要為測(cè)試模擬數(shù)據(jù),需要將模擬邏輯移動(dòng)到我們模擬的旁邊并使其可重用。
雖然在尚未有很好的測(cè)試覆蓋率的代碼庫(kù)中編寫(xiě)測(cè)試時(shí),經(jīng)常會(huì)出現(xiàn)復(fù)雜的大數(shù)據(jù)結(jié)構(gòu),但測(cè)試中的特定功能只需要其中的一部分。短期內(nèi)無(wú)需擔(dān)心其他屬性更簡(jiǎn)單。
最近一次是當(dāng)其中一個(gè)屬性發(fā)生變化時(shí),我們必須在所有測(cè)試中更改它而不是一個(gè)中心位置。此外,在某些情況下,被測(cè)代碼依賴于我們之前認(rèn)為不重要的屬性,然后必須更新該功能的所有測(cè)試。
6. 可選屬性
將屬性定義為有時(shí)存在,有時(shí)不存在的可選屬性。
清楚地表達(dá),模型哪些組合存在,哪些不存在。
將屬性定義為可選而不是劃分類型更容易并且生成的代碼更少。它還需要對(duì)正在開(kāi)發(fā)的產(chǎn)品有充分的了解,并且可以在對(duì)產(chǎn)品的假設(shè)發(fā)生變化時(shí)限制代碼的使用。
類型系統(tǒng)的最大好處是它們可以用編譯時(shí)檢查代替運(yùn)行時(shí)檢查。通過(guò)更多的快速輸入,可以在編譯時(shí)檢查可能被忽視的錯(cuò)誤。
7. 使用一個(gè)字母作為泛型參數(shù)
用一個(gè)字母給作為名稱,比如常用的T作為泛型名稱!
應(yīng)該給出一個(gè)完整的描述性類型名稱。
我猜很多人有這種壞習(xí)慣,因?yàn)榧词故枪俜轿臋n也使用一個(gè)字母的名稱。按 T 代替寫(xiě)全名可以更快地鍵入,并且不需要考慮太多。
泛型類型是變量,就像其他變量一樣。當(dāng) IDE 開(kāi)始向我們展示這些技術(shù)性時(shí),我們已經(jīng)放棄了在變量名稱中描述變量技術(shù)性的想法。例如。我們通常只寫(xiě) const name = ‘Daniel’ 而不是 const strName = ‘Daniel’。此外,一個(gè)字母的變量名通常會(huì)引起轟動(dòng),因?yàn)槿绻豢此鼈兊穆暶?,可能很難翻譯它們的含義。
8.非布爾檢查
通過(guò)將值直接傳遞給 if 語(yǔ)句來(lái)檢查值是否已定義。
我們可以明確檢查我們關(guān)心的情況。
用簡(jiǎn)短的方式編寫(xiě)檢查看起來(lái)更簡(jiǎn)潔,并且可以讓我們避免思考我們真正想要檢查的內(nèi)容。
也許我們應(yīng)該考慮一下我們真正想要檢查的內(nèi)容。例如,上面給出的示例以不同的方式處理 countOfNewMessages 為 0 的情況。
9. !!操作符
將非布爾值轉(zhuǎn)換為布爾值。
明確檢查我們關(guān)心的狀況。
對(duì)我們中的一些人來(lái)說(shuō),理解!
很簡(jiǎn)單。它看起來(lái)簡(jiǎn)短而簡(jiǎn)潔,如果您已經(jīng)熟悉它,那么您就會(huì)知道它是關(guān)于什么的。這是將任何值轉(zhuǎn)換為布爾值的簡(jiǎn)便方法。尤其是在代碼庫(kù)中,假值(如 null
、undefined
和“”
)之間沒(méi)有明確的語(yǔ)義分離。
使用 !!
通過(guò)宣傳內(nèi)部知識(shí)來(lái)混淆代碼的真正含義。這使得新開(kāi)發(fā)人員更不容易訪問(wèn)代碼庫(kù),無(wú)論是一般開(kāi)發(fā)的新手,還是 JavaScript 的新手。引入細(xì)微的錯(cuò)誤也很容易。來(lái)自“非布爾布爾檢查”的 countOfNewMessages
為 0
的問(wèn)題仍然存在 !!
。
到此這篇關(guān)于手寫(xiě)TypeScript 時(shí)很多人常犯的幾個(gè)錯(cuò)誤的文章就介紹到這了,更多相關(guān)TypeScript 錯(cuò)誤內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
純javascript前端實(shí)現(xiàn)base64圖片下載(兼容IE10+)
這篇文章主要介紹了純javascript前端實(shí)現(xiàn)base64圖片下載(兼容IE10+),小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2018-09-09Jquery顏色選擇器ColorPicker實(shí)現(xiàn)代碼
這里我要分享一個(gè)自己修改的顏色選擇器,有需要的朋友參考下2012-11-11JS 排序輸出實(shí)現(xiàn)table行號(hào)自增前端動(dòng)態(tài)生成的tr
一個(gè)項(xiàng)目,需要對(duì)數(shù)據(jù)進(jìn)行排序輸出,要求有行號(hào),依次遞增1.2.3.4.5,使用前端動(dòng)態(tài)生成的tr2014-08-08Javascript 多物體運(yùn)動(dòng)的實(shí)現(xiàn)
這篇文章主要介紹了Javascript 多物體運(yùn)動(dòng)的實(shí)現(xiàn),需要的朋友可以參考下2014-12-12JS實(shí)現(xiàn)瀏覽器狀態(tài)欄文字從右向左彈出效果代碼
這篇文章主要介紹了JS實(shí)現(xiàn)瀏覽器狀態(tài)欄文字從右向左彈出效果,涉及JavaScript結(jié)合時(shí)間函數(shù)遍歷字符串及動(dòng)態(tài)改變狀態(tài)欄顯示效果的相關(guān)技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下2015-10-10編寫(xiě)跨瀏覽器的javascript代碼必備[js多瀏覽器兼容寫(xiě)法]
下面比較了幾種瀏覽器之間的差異,在寫(xiě)javascript代碼時(shí) 要時(shí)刻注意這些差異2008-10-10