色哟哟视频在线观看-色哟哟视频在线-色哟哟欧美15最新在线-色哟哟免费在线观看-国产l精品国产亚洲区在线观看-国产l精品国产亚洲区久久

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線(xiàn)課程
  • 觀看技術(shù)視頻
  • 寫(xiě)文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

為什么你根本學(xué)不下去TypeScript?

馬哥Linux運(yùn)維 ? 來(lái)源:稀土掘金 ? 作者:一介4188 ? 2023-08-11 10:12 ? 次閱讀

前言

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

有感于這些問(wèn)題,我想從最簡(jiǎn)單的一個(gè)角度來(lái)切入介紹一下 TypeScript,并向大家介紹并不是只要是個(gè)類(lèi)型運(yùn)算就是體操。并在文中介紹一種基本思想作為你使用類(lèi)型系統(tǒng)的基本指引。

引子

我將從一個(gè)相對(duì)簡(jiǎn)單的 API 的設(shè)計(jì)過(guò)程中闡述關(guān)于類(lèi)型的故事。在這里我們可以假設(shè)我們現(xiàn)在是一個(gè)工具的開(kāi)發(fā)者,然后我們需要設(shè)計(jì)一個(gè) API 用于從對(duì)象中拿取指定的一些 key 作為一個(gè)新的對(duì)象返回給外面使用。

垃圾 TypeScript

一個(gè)人說(shuō):我才不用什么破類(lèi)型,我寫(xiě)代碼就是要沒(méi)有類(lèi)型,我就是要隨心所欲的寫(xiě)。然后寫(xiě)下了這段代碼。

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

他的用戶(hù)默默的寫(xiě)下了這段代碼:

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

寫(xiě)完運(yùn)行,發(fā)現(xiàn)問(wèn)題大條了,控制臺(tái)一堆報(bào)錯(cuò),接口數(shù)據(jù)也提交不上去了,怎么辦呢?

剛學(xué) TypeScript

一個(gè)人說(shuō):稍微檢查一下傳入類(lèi)型就好了,別讓人給我亂傳參數(shù)就行。

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

很好,上面的問(wèn)題便不復(fù)存在了,API 也是基本可用的了。但是!當(dāng)對(duì)象復(fù)雜的時(shí)候,以及字段并不是短單詞長(zhǎng)度的時(shí)候就會(huì)發(fā)現(xiàn)了一個(gè)沒(méi)解決的問(wèn)題。

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

從肉眼角度上,我們很難發(fā)現(xiàn)這前后的不一致,所以我們?yōu)槭裁匆屨{(diào)用方的用戶(hù)自己去 check 自己的字段有沒(méi)有寫(xiě)對(duì)呢?

不就 TypeScript

一個(gè)人說(shuō):這還不簡(jiǎn)單,用個(gè)泛型加 keyof 不就行了。

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

我們又進(jìn)一步解決的上面的問(wèn)題,但是!還是有著相似的問(wèn)題,雖然我們不用檢查 keys 是不是傳入的是一個(gè)正確的值了,但是我們實(shí)際上對(duì)返回的值也存在一個(gè)類(lèi)似的問(wèn)題。

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

一點(diǎn)小小的拓展

在這里我們看起來(lái)似乎是一個(gè)很簡(jiǎn)單的功能,但實(shí)際上蘊(yùn)含著一個(gè)比較重要的信息

為什么我們之前的方式都拿不到用戶(hù)傳入進(jìn)來(lái)的類(lèi)型信息呢?是有原因的,當(dāng)我們?cè)O(shè)計(jì)的 API 的時(shí)候,前面的角度是從,如何校驗(yàn)類(lèi)型方向進(jìn)行的思考。

而這里是嘗試去通過(guò)約定好的一種規(guī)則,通過(guò) TypeScript 的隱式類(lèi)型推斷獲得到傳入的類(lèi)型,再通過(guò)約定的規(guī)則轉(zhuǎn)化出一種新的類(lèi)型約束來(lái)對(duì)用戶(hù)的輸入進(jìn)行限制。

算算 TypeScript

一個(gè)人說(shuō):好辦,算出來(lái)一個(gè)新的類(lèi)型就好了。

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

到這里已經(jīng)是對(duì)類(lèi)型的作用有了基礎(chǔ)的了解了,能寫(xiě)出來(lái)符合開(kāi)發(fā)者所能接受的類(lèi)型相對(duì)友好的代碼了。我們可以再來(lái)思考一些更特殊的情況:

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

完美 TypeScript

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

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"'.

一個(gè)相對(duì)來(lái)說(shuō)比較完美的 pick 函數(shù)便完成了。

總結(jié)

我們?cè)賮?lái)回到我們的標(biāo)題吧,從我對(duì)大多數(shù)人的觀察來(lái)說(shuō),很多的人開(kāi)始來(lái)使用 TypeScript 有幾種原因:

看到大佬們都在玩,所以自己也想來(lái)“玩”,然后為了過(guò)類(lèi)型校驗(yàn)而去寫(xiě)

看到一些成熟的項(xiàng)目在使用 TypeScript ,想?yún)⑴c貢獻(xiàn),參與過(guò)程中為了讓類(lèi)型通過(guò)而想辦法去解決類(lèi)型報(bào)錯(cuò)

公司整體技術(shù)棧采用的是 TypeScript ,要用 TypeScript 進(jìn)行業(yè)務(wù)編寫(xiě),從而為了過(guò)類(lèi)型檢查和 review 而去解決類(lèi)型問(wèn)題

諸如此類(lèi)的問(wèn)題還有很多,我將這種都劃分為「為了解決類(lèi)型檢查的問(wèn)題」而進(jìn)行的類(lèi)型編程,這也是大多數(shù)人為什么非常不適應(yīng) TypeScript,甚至不喜歡他的一個(gè)原因。這其實(shí)對(duì)學(xué)習(xí) TypeScript 并不是一個(gè)很好的思路,在這里我覺(jué)得我們需要站在設(shè)計(jì)者的角度去對(duì)類(lèi)型系統(tǒng)進(jìn)行思考。我覺(jué)得有以下幾個(gè)角度:

類(lèi)型檢查到位

類(lèi)型提示友好

類(lèi)型檢查嚴(yán)格

擴(kuò)展性十足

我們?nèi)绻驹谶@幾個(gè)角度對(duì)我們的 API 進(jìn)行設(shè)計(jì),我們可以發(fā)現(xiàn),開(kāi)發(fā)者能夠很輕松的將他們需要的代碼編寫(xiě)出來(lái),而盡量不用去翻閱文檔,查找 example。

希望通過(guò)我的這篇分享,大家能對(duì) TypeScript 多一些理解,并參與到生態(tài)中來(lái),守護(hù)我們的 JavaScript。

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





審核編輯:劉清

聲明:本文內(nèi)容及配圖由入駐作者撰寫(xiě)或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問(wèn)題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • JAVA語(yǔ)言
    +關(guān)注

    關(guān)注

    0

    文章

    138

    瀏覽量

    20090
  • javascript
    +關(guān)注

    關(guān)注

    0

    文章

    516

    瀏覽量

    53851
  • java接口
    +關(guān)注

    關(guān)注

    0

    文章

    2

    瀏覽量

    1165

原文標(biāo)題:為什么你非常不適應(yīng) TypeScript

文章出處:【微信號(hào):magedu-Linux,微信公眾號(hào):馬哥Linux運(yùn)維】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。

收藏 人收藏

    評(píng)論

    相關(guān)推薦

    使用DAC3484+TRF3705,測(cè)試發(fā)現(xiàn)調(diào)制出來(lái)的射頻150M左右底噪很高怎么解決?

    各位TI專(zhuān)家,最近使用DAC3484+TRF3705,測(cè)試發(fā)現(xiàn)調(diào)制出來(lái)的射頻150M左右底噪很高,目前確認(rèn)是模擬IQ信號(hào)帶來(lái)的,但是無(wú)論怎么調(diào)試都降不下去,目前將進(jìn)行改板設(shè)計(jì),心理沒(méi)底,畢竟成本
    發(fā)表于 12-03 07:03

    ESP32 深度睡眠

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

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

    最近用rt-thread studio 生成了一個(gè)stm32f103zet6得工程,用cubemx setting生成了時(shí)鐘,如下圖所示: 結(jié)果發(fā)現(xiàn)代碼跑到這里就跑不下去了 后來(lái)發(fā)現(xiàn)會(huì)一直
    發(fā)表于 07-11 06:45

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

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

    鴻蒙開(kāi)發(fā):【從TypeScript到ArkTS的適配規(guī)則】

    ArkTS通過(guò)規(guī)范約束了TypeScript(簡(jiǎn)稱(chēng)TS)中過(guò)于靈活而影響開(kāi)發(fā)正確性或者給運(yùn)行時(shí)帶來(lái)不必要額外開(kāi)銷(xiāo)的特性
    的頭像 發(fā)表于 05-14 09:37 ?1964次閱讀
    鴻蒙開(kāi)發(fā):【從<b class='flag-5'>TypeScript</b>到ArkTS的適配規(guī)則】

    STM8L052在主函數(shù)while電流900ua加一句halt電流210ua怎么都調(diào)不下去的原因?

    畫(huà)了一塊板子,只焊了復(fù)位電路在主函數(shù)while 電流900ua加一句 halt電流 210ua 怎么都調(diào)不下去請(qǐng)問(wèn)大家 是不是哪里出錯(cuò)了,res管腳為上拉輸入 其他都是浮空輸入。。為什么跟標(biāo)準(zhǔn)的差這么多...
    發(fā)表于 05-13 08:14

    不小心把SWIM引腳設(shè)置成了out,結(jié)果修改的程序怎么也下載不下去了,芯片是不是報(bào)廢了?

    犯了個(gè)低級(jí)錯(cuò)誤,不小心把SWIM引腳設(shè)置成了out,結(jié)果修改的程序怎么也下載不下去了,STVP還是內(nèi)嵌的programmer均顯示連接設(shè)備了。不知道是不是有其他方法?還是這塊芯片就報(bào)廢了呢?
    發(fā)表于 04-22 07:24

    鴻蒙TypeScript學(xué)習(xí)21天:【聲明文件】

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

    鴻蒙TypeScript學(xué)習(xí)第20天:【模塊】

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

    鴻蒙語(yǔ)言TypeScript學(xué)習(xí)第16天:【類(lèi)】

    TypeScript 支持面向?qū)ο蟮乃刑匦?,比?類(lèi)、接口等。
    的頭像 發(fā)表于 04-15 09:29 ?1018次閱讀
    鴻蒙語(yǔ)言<b class='flag-5'>TypeScript</b>學(xué)習(xí)第16天:【類(lèi)】

    鴻蒙TypeScript 開(kāi)發(fā)學(xué)習(xí)第9天:【TypeScript Number】

    TypeScript 與 JavaScript 類(lèi)似,支持 Number 對(duì)象。 Number 對(duì)象是原始數(shù)值的包裝對(duì)象。
    的頭像 發(fā)表于 04-07 18:02 ?784次閱讀
    鴻蒙<b class='flag-5'>TypeScript</b> 開(kāi)發(fā)學(xué)習(xí)第9天:【<b class='flag-5'>TypeScript</b> Number】

    鴻蒙TypeScript入門(mén)學(xué)習(xí)第6天:【條件語(yǔ)句】

    條件語(yǔ)句用于基于不同的條件來(lái)執(zhí)行不同的動(dòng)作。 TypeScript 條件語(yǔ)句是通過(guò)一條或多條語(yǔ)句的執(zhí)行結(jié)果(True 或 False)來(lái)決定執(zhí)行的代碼塊。
    的頭像 發(fā)表于 04-01 13:51 ?752次閱讀
    鴻蒙<b class='flag-5'>TypeScript</b>入門(mén)學(xué)習(xí)第6天:【條件語(yǔ)句】

    鴻蒙TypeScript開(kāi)發(fā)入門(mén)學(xué)習(xí)第3天:【TS基礎(chǔ)類(lèi)型】

    任意值是 TypeScript 針對(duì)編程時(shí)類(lèi)型不明確的變量使用的一種數(shù)據(jù)類(lèi)型,它常用于以下三種情況。
    的頭像 發(fā)表于 03-28 15:02 ?533次閱讀
    鴻蒙<b class='flag-5'>TypeScript</b>開(kāi)發(fā)入門(mén)學(xué)習(xí)第3天:【TS基礎(chǔ)類(lèi)型】

    鴻蒙TypeScript入門(mén)學(xué)習(xí)第2天【TypeScript安裝】

    本文介紹 TypeScript 環(huán)境的安裝。 我們需要使用到 npm 工具安裝,如果還不了解 npm,可以參考我之前文檔。
    的頭像 發(fā)表于 03-27 15:22 ?506次閱讀
    鴻蒙<b class='flag-5'>TypeScript</b>入門(mén)學(xué)習(xí)第2天【<b class='flag-5'>TypeScript</b>安裝】

    E203用iverilog12仿真時(shí),run_test一直卡怎么解決?

    求助??!一直卡在這里進(jìn)行不下去了,請(qǐng)問(wèn)大佬們這是為什么呀?每個(gè)步驟都是按照教程來(lái)的!iverilog用的12,ubuntu 20.04
    發(fā)表于 01-10 07:07
    主站蜘蛛池模板: 伊人香蕉在线播放视频免费| 国偷自产视频一区二区久| 欧美三级黄色大片| 最近中文字幕在线中文视频| 黑人特黄AA完整性大片| 向日葵视频app下载18岁以下勿看| 亚洲AV久久久噜噜噜噜| 国产精品免费一区二区三区视频| 欧美大香线蕉线伊人久久| 2020国产成人精品免费视频| 久久视频这里只精品6国产| 亚洲伊人情人综合网站| 黑人BBCVIDEOS极品| 亚洲精品第一综合99久久| 国产又黄又粗又爽又色的视频软件| 天美传媒在线观看完整高清| 俄罗斯少女人体| 色偷偷7777www| 俄罗斯极品hd| 熟女人妻-蜜臀AV-首页| 国产1广场舞丰满老女偷| 色噜噜视频| 国产成人在线播放视频| 无限资源在线观看完整版免费下载| 国产99网站| 午夜伦理电影在线观免费| 国产人妻人伦精品59HHH| 羞羞漫画视频| 国精产品一区一区三区M| 亚洲精品另类有吗中文字幕| 好大快用力深一点h视频| 亚洲伊人精品综合在合线| 久久青草影院| 91综合久久久久婷婷| 欧美 日韩 无码 有码 在线 | 日本亚洲电影| 高H短篇辣肉纯肉| 无套内射CHINESEHD熟女| 国产午夜精AV在线麻豆| 亚洲另类欧美综合在线| 久久精品动漫99精品动漫|