那曲檬骨新材料有限公司

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

為什么你根本學不下去TypeScript?

馬哥Linux運維 ? 來源:稀土掘金 ? 作者:一介4188 ? 2023-08-11 10:12 ? 次閱讀

前言

在群里看到一些問題和言論:為什么你們這么喜歡“類型體操”?為什么我根本學不下去 TypeScript?我最討厭那些做類型體操的了;為什么我學了沒過多久馬上又忘了?

有感于這些問題,我想從最簡單的一個角度來切入介紹一下 TypeScript,并向大家介紹并不是只要是個類型運算就是體操。并在文中介紹一種基本思想作為你使用類型系統的基本指引。

引子

我將從一個相對簡單的 API 的設計過程中闡述關于類型的故事。在這里我們可以假設我們現在是一個工具的開發者,然后我們需要設計一個 API 用于從對象中拿取指定的一些 key 作為一個新的對象返回給外面使用。

垃圾 TypeScript

一個人說:我才不用什么破類型,我寫代碼就是要沒有類型,我就是要隨心所欲的寫。然后寫下了這段代碼。

declarefunctionpick(target:any,...keys:any):any

他的用戶默默的寫下了這段代碼:

pick(undefined,'a',1).b

寫完運行,發現問題大條了,控制臺一堆報錯,接口數據也提交不上去了,怎么辦呢?

剛學 TypeScript

一個人說:稍微檢查一下傳入類型就好了,別讓人給我亂傳參數就行。

declarefunctionpick(target:Record,...keys:string[]):unknown

很好,上面的問題便不復存在了,API 也是基本可用的了。但是!當對象復雜的時候,以及字段并不是短單詞長度的時候就會發現了一個沒解決的問題。

pick({abcdefghijkl:'123'},'abcdefghikjl')

從肉眼角度上,我們很難發現這前后的不一致,所以我們為什么要讓調用方的用戶自己去 check 自己的字段有沒有寫對呢?

不就 TypeScript

一個人說:這還不簡單,用個泛型加 keyof 不就行了。

declarefunctionpick<
??T?extends?Record
>(target:T,...keys:(keyofT)[]):unknown

我們又進一步解決的上面的問題,但是!還是有著相似的問題,雖然我們不用檢查 keys 是不是傳入的是一個正確的值了,但是我們實際上對返回的值也存在一個類似的問題。

pick({abcdefghijkl:'123'},'abcdefghijkl').abcdefghikjl

一點小小的拓展

在這里我們看起來似乎是一個很簡單的功能,但實際上蘊含著一個比較重要的信息

為什么我們之前的方式都拿不到用戶傳入進來的類型信息呢?是有原因的,當我們設計的 API 的時候,前面的角度是從,如何校驗類型方向進行的思考。

而這里是嘗試去通過約定好的一種規則,通過 TypeScript 的隱式類型推斷獲得到傳入的類型,再通過約定的規則轉化出一種新的類型約束來對用戶的輸入進行限制。

算算 TypeScript

一個人說:好辦,算出來一個新的類型就好了。

declarefunctionpick<
??T?extends?Record,
KeysextendskeyofT
>(target:T,...keys:Keys[]):{
[KinKeys]:T[K]
}

到這里已經是對類型的作用有了基礎的了解了,能寫出來符合開發者所能接受的類型相對友好的代碼了。我們可以再來思考一些更特殊的情況:

//輸入了重復的key
pick({a:''},'a','a')

完美 TypeScript

到這里,我們便是初步開始了類型“體操”。但是在本篇里,我們不去分析它。

exporttypeL2T=[L]extends[never]
?[]
:LextendsinferLItem
?[LItem?,...L2T,LAlias>]
:never

declarefunctionpick<
??T?extends?Record,
KeysextendsL2T
>(target:T,...keys:Keys):Pick

constx0=pick({a:'1',b:'2'},'a')
console.log(x0.a)
//@ts-expect-error
console.log(x0.b)

constx1=pick({a:'1',b:'2'},'a','a')
//^^^^^^^^
//TS2345:Argumentoftype'["a","a"]'isnotassignabletoparameteroftype'["a"?,"b"?]|["b"?,"a"?]'.
//Type'["a","a"]'isnotassignabletotype'["a"?,"b"?]'.
//Typeatposition1insourceisnotcompatiblewithtypeatposition1intarget.
//Type'"a"'isnotassignabletotype'"b"'.

一個相對來說比較完美的 pick 函數便完成了。

總結

我們再來回到我們的標題吧,從我對大多數人的觀察來說,很多的人開始來使用 TypeScript 有幾種原因:

看到大佬們都在玩,所以自己也想來“玩”,然后為了過類型校驗而去寫

看到一些成熟的項目在使用 TypeScript ,想參與貢獻,參與過程中為了讓類型通過而想辦法去解決類型報錯

公司整體技術棧采用的是 TypeScript ,要用 TypeScript 進行業務編寫,從而為了過類型檢查和 review 而去解決類型問題

諸如此類的問題還有很多,我將這種都劃分為「為了解決類型檢查的問題」而進行的類型編程,這也是大多數人為什么非常不適應 TypeScript,甚至不喜歡他的一個原因。這其實對學習 TypeScript 并不是一個很好的思路,在這里我覺得我們需要站在設計者的角度去對類型系統進行思考。我覺得有以下幾個角度:

類型檢查到位

類型提示友好

類型檢查嚴格

擴展性十足

我們如果站在這幾個角度對我們的 API 進行設計,我們可以發現,開發者能夠很輕松的將他們需要的代碼編寫出來,而盡量不用去翻閱文檔,查找 example。

希望通過我的這篇分享,大家能對 TypeScript 多一些理解,并參與到生態中來,守護我們的 JavaScript。

鏈接:https://juejin.cn/post/7248599585751515173





審核編輯:劉清

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • JAVA語言
    +關注

    關注

    0

    文章

    138

    瀏覽量

    20179
  • javascript
    +關注

    關注

    0

    文章

    525

    瀏覽量

    53945
  • java接口
    +關注

    關注

    0

    文章

    2

    瀏覽量

    1188

原文標題:為什么你非常不適應 TypeScript

文章出處:【微信號:magedu-Linux,微信公眾號:馬哥Linux運維】歡迎添加關注!文章轉載請注明出處。

收藏 人收藏

    評論

    相關推薦

    AFE7070鏡像調不下去怎么處理?

    gaina、gainb、phase調節有啥規律嗎,手冊上沒這一塊的說明,而且我這邊鏡像最大調低了-23db
    發表于 12-26 06:17

    使用DAC3484+TRF3705,測試發現調制出來的射頻150M左右底噪很高怎么解決?

    各位TI專家,最近使用DAC3484+TRF3705,測試發現調制出來的射頻150M左右底噪很高,目前確認是模擬IQ信號帶來的,但是無論怎么調試都降不下去,目前將進行改板設計,心理沒底,畢竟成本
    發表于 12-03 07:03

    ESP32 深度睡眠

    使用的是ESP32S2 idf 5.2.2 官方代碼歷程deep_sleep 進入深度睡眠 睡眠后功耗為1.9mA,一直降不下去
    發表于 07-11 09:50

    RT-THREAD studio生成的工程,晶振不起振是怎么回事?

    最近用rt-thread studio 生成了一個stm32f103zet6得工程,用cubemx setting生成了時鐘,如下圖所示: 結果發現代碼跑到這里就跑不下去了 后來發現會一直
    發表于 07-11 06:45

    ESP32S2最小模塊,采用官方例子進入深度睡眠,功耗為什么降不到和官方手冊一致

    使用的是ESP32S2 idf 5.2.2 官方代碼歷程deep_sleep 進入深度睡眠 睡眠后功耗為1.9mA,一直降不下去
    發表于 07-10 18:02

    鴻蒙開發:【從TypeScript到ArkTS的適配規則】

    ArkTS通過規范約束了TypeScript(簡稱TS)中過于靈活而影響開發正確性或者給運行時帶來不必要額外開銷的特性
    的頭像 發表于 05-14 09:37 ?2130次閱讀
    鴻蒙開發:【從<b class='flag-5'>TypeScript</b>到ArkTS的適配規則】

    STM8L052在主函數while電流900ua加一句halt電流210ua怎么都調不下去的原因?

    畫了一塊板子,只焊了復位電路在主函數while 電流900ua加一句 halt電流 210ua 怎么都調不下去請問大家 是不是哪里出錯了,res管腳為上拉輸入 其他都是浮空輸入。。為什么跟標準的差這么多...
    發表于 05-13 08:14

    不小心把SWIM引腳設置成了out,結果修改的程序怎么也下載不下去了,芯片是不是報廢了?

    犯了個低級錯誤,不小心把SWIM引腳設置成了out,結果修改的程序怎么也下載不下去了,STVP還是內嵌的programmer均顯示連接設備了。不知道是不是有其他方法?還是這塊芯片就報廢了呢?
    發表于 04-22 07:24

    鴻蒙TypeScript學習21天:【聲明文件】

    TypeScript 作為 JavaScript 的超集,在開發過程中不可避免要引用其他第三方的 JavaScript 的庫。
    的頭像 發表于 04-19 15:02 ?657次閱讀
    鴻蒙<b class='flag-5'>TypeScript</b>學習21天:【聲明文件】

    鴻蒙TypeScript學習第20天:【模塊】

    TypeScript 模塊的設計理念是可以更換的組織代碼。 模塊是在其自身的作用域里執行,并不是在全局作用域,這意味著定義在模塊里面的變量、函數和類等在模塊外部是不可見的,除非明確地使用 export 導出它們。類似地,我們必須通過 import 導入其他模塊導出的變量、函數、類等。
    的頭像 發表于 04-18 15:19 ?763次閱讀
    鴻蒙<b class='flag-5'>TypeScript</b>學習第20天:【模塊】

    鴻蒙語言TypeScript學習第16天:【類】

    TypeScript 支持面向對象的所有特性,比如 類、接口等。
    的頭像 發表于 04-15 09:29 ?1101次閱讀
    鴻蒙語言<b class='flag-5'>TypeScript</b>學習第16天:【類】

    鴻蒙TypeScript 開發學習第9天:【TypeScript Number】

    TypeScript 與 JavaScript 類似,支持 Number 對象。 Number 對象是原始數值的包裝對象。
    的頭像 發表于 04-07 18:02 ?834次閱讀
    鴻蒙<b class='flag-5'>TypeScript</b> 開發學習第9天:【<b class='flag-5'>TypeScript</b> Number】

    鴻蒙TypeScript入門學習第6天:【條件語句】

    條件語句用于基于不同的條件來執行不同的動作。 TypeScript 條件語句是通過一條或多條語句的執行結果(True 或 False)來決定執行的代碼塊。
    的頭像 發表于 04-01 13:51 ?799次閱讀
    鴻蒙<b class='flag-5'>TypeScript</b>入門學習第6天:【條件語句】

    鴻蒙TypeScript開發入門學習第3天:【TS基礎類型】

    任意值是 TypeScript 針對編程時類型不明確的變量使用的一種數據類型,它常用于以下三種情況。
    的頭像 發表于 03-28 15:02 ?579次閱讀
    鴻蒙<b class='flag-5'>TypeScript</b>開發入門學習第3天:【TS基礎類型】

    鴻蒙TypeScript入門學習第2天【TypeScript安裝】

    本文介紹 TypeScript 環境的安裝。 我們需要使用到 npm 工具安裝,如果還不了解 npm,可以參考我之前文檔。
    的頭像 發表于 03-27 15:22 ?546次閱讀
    鴻蒙<b class='flag-5'>TypeScript</b>入門學習第2天【<b class='flag-5'>TypeScript</b>安裝】
    香港六合彩报| 八大胜官网| 百家乐龙虎斗扎金花| 百家乐官网下注平台| 百家乐国际赌场娱乐网规则| 粤港澳百家乐官网娱乐场| 百家乐官网赌博机原理| 大发888下载官方网站| 百家乐赌博论坛| 状元百家乐官网的玩法技巧和规则 | 百家乐重要心态| 百家乐官网返点| 百家乐官网玩法简介| 六合彩管家婆| 太阳城投诉| 百家乐赌博规| 澳门百家乐娱乐城送彩金| 百家乐官网奥| 百家乐官网信誉平台开户| 足球比分网| 大发888娱乐城dafa888dafa8| 百家乐桌德州扑克桌| 百家乐官网最新分析仪| 优惠搏百家乐官网的玩法技巧和规则 | 信誉好百家乐平台| 先锋百家乐官网的玩法技巧和规则| 百家乐官网有作弊的吗| 长春市| 兴山县| 佳木斯市| 太阳城百家乐| 丹巴县| 溆浦县| 百家乐官网论坛在线提供| E乐博网址| 亚斯博彩网| 维也纳娱乐城| 博彩网导航| 皇冠网上69691| 特克斯县| 百家乐官网要怎么玩啊|