一区二区三区三上|欧美在线视频五区|国产午夜无码在线观看视频|亚洲国产裸体网站|无码成年人影视|亚洲AV亚洲AV|成人开心激情五月|欧美性爱内射视频|超碰人人干人人上|一区二区无码三区亚洲人区久久精品

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

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

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

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

馬哥Linux運(yùn)維 ? 來源:稀土掘金 ? 作者:一介4188 ? 2023-08-11 10:12 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

前言

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

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

引子

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

垃圾 TypeScript

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

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

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

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

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

剛學(xué) TypeScript

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

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

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

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

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

不就 TypeScript

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

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

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

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

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

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

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

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

算算 TypeScript

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

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

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

//輸入了重復(fù)的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"'.

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

總結(jié)

我們?cè)賮砘氐轿覀兊臉?biāo)題吧,從我對(duì)大多數(shù)人的觀察來說,很多的人開始來使用 TypeScript 有幾種原因:

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

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

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

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

類型檢查到位

類型提示友好

類型檢查嚴(yán)格

擴(kuò)展性十足

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

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

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





審核編輯:劉清

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

    關(guān)注

    0

    文章

    138

    瀏覽量

    20693
  • javascript
    +關(guān)注

    關(guān)注

    0

    文章

    525

    瀏覽量

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

    關(guān)注

    0

    文章

    2

    瀏覽量

    1225

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

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

收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評(píng)論

    相關(guān)推薦
    熱點(diǎn)推薦

    計(jì)量學(xué)之校準(zhǔn)、溯源性和標(biāo)準(zhǔn)

    一、計(jì)量學(xué)和計(jì)量工作者用于校準(zhǔn)領(lǐng)域的通用名稱是“計(jì)量學(xué)”,根據(jù)國家計(jì)量技術(shù)規(guī)范JJF1001-2011《通用計(jì)量術(shù)語及定義》,計(jì)量定義為“實(shí)現(xiàn)單位統(tǒng)一、量值準(zhǔn)確可靠的活動(dòng)”。校準(zhǔn)機(jī)構(gòu)常稱為計(jì)量實(shí)驗(yàn)室
    的頭像 發(fā)表于 05-30 17:21 ?340次閱讀
    計(jì)量<b class='flag-5'>學(xué)</b>之校準(zhǔn)、溯源性和標(biāo)準(zhǔn)

    tscircuit - 電路開發(fā)的 React 范式? 用TypeScript、React和 AI工具構(gòu)建電子產(chǎn)品

    TypeScript、React 和 AI 工具構(gòu)建電子產(chǎn)品。
    的頭像 發(fā)表于 04-30 18:18 ?705次閱讀
    tscircuit - 電路開發(fā)的 React 范式?   用<b class='flag-5'>TypeScript</b>、React和 AI工具構(gòu)建電子產(chǎn)品

    KaihongOS操作系統(tǒng):ArkTS語言基礎(chǔ)

    和特性都適用于ArkTS。ArkTS為TypeScript添加了一些特定的API和組件,以便更好地在KaihongOS上進(jìn)行開發(fā)。 ArkTS基礎(chǔ) 類和接口 在ArkTS中,可以定義類和接口
    發(fā)表于 04-23 06:31

    學(xué)硬件好還是學(xué)軟件好?

    學(xué)硬件好還是學(xué)軟件好? 選擇學(xué)習(xí)硬件還是軟件取決于個(gè)人興趣、職業(yè)目標(biāo)以及對(duì)不同工作方式的偏好。以下是兩者的一些比較,幫助你做出更合適的選擇。 學(xué)習(xí)硬件可以讓深入了解計(jì)算機(jī)和電子設(shè)備的物理組成部分
    發(fā)表于 04-07 15:27

    ADS1248做DRDY時(shí),DOUT/DRDY引腳低不下來為什么?

    IDAC0:0X0F;DOUT/DRDY引腳既做數(shù)據(jù)輸出,又做DRDY,寄存器讀寫都有效,為什么做DRDY時(shí),DOUT/DRDY引腳低不下來為什么?這樣操作與DOUT/DRDY引腳只做DOUT的操作有什么不同的地方?START一直高,CS一直低,對(duì)嗎?
    發(fā)表于 02-07 06:55

    ArkTS語言基礎(chǔ)介紹篇

    KaihongOS是一個(gè)開源的、跨設(shè)備的操作系統(tǒng),它支持多種設(shè)備類型。ArkTS是KaihongOS應(yīng)用開發(fā)中使用的TypeScript超集,提供了一套豐富的API來構(gòu)建應(yīng)用界面和邏輯。 詳見資料說明!
    發(fā)表于 01-10 10:15

    AFE7070鏡像調(diào)不下去怎么處理?

    gaina、gainb、phase調(diào)節(jié)有啥規(guī)律嗎,手冊(cè)上沒這一塊的說明,而且我這邊鏡像最大調(diào)低了-23db
    發(fā)表于 12-26 06:17

    新手怎么學(xué)嵌入式?

    新手怎么學(xué)嵌入式? 在科技飛速發(fā)展的今天,嵌入式技術(shù)已經(jīng)滲透到我們生活的各個(gè)角落,從智能手機(jī)到智能家居,從汽車電子到醫(yī)療設(shè)備。對(duì)于新手而言,嵌入式技術(shù)就像是一座充滿神秘和機(jī)遇的寶藏,等待著大家去挖掘
    發(fā)表于 12-12 10:51

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

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

    什么是光子學(xué)?

    ? 本文概述了光子學(xué),包括其基本原理、關(guān)鍵技術(shù)、應(yīng)用和新興趨勢(shì)。 一、光子學(xué)的基本原理 光子學(xué)是一門研究光和其他形式輻射能的學(xué)科。它涉及使用光學(xué)元件、激光、光纖和電子光學(xué)儀器來產(chǎn)生、操縱和檢測(cè)光。它
    的頭像 發(fā)表于 10-29 06:21 ?696次閱讀

    旗幟鮮明反內(nèi)卷,連接器上下游如何做到?

    :“汽車行業(yè)的卷,讓中國品牌達(dá)到了新高度?!?吉利董事長李書福說:“中國汽車工業(yè)內(nèi)卷程度全球第一,既是好事也是壞事?!?嵐圖CEO盧放說:“一個(gè)車企如果活不下去,對(duì)老車主來講可能是更大的背刺?!?從7.98萬打出“電比油低”口號(hào)
    的頭像 發(fā)表于 09-23 10:00 ?429次閱讀
    旗幟鮮明反內(nèi)卷,連接器上下游如何做到?

    HarmonyOS Next原生應(yīng)用開發(fā)-從TS到ArkTS的適配規(guī)則(十五)

    。對(duì)于數(shù)組來說,可以使用常規(guī)的for循環(huán)。TypeScript let a: string[] = [\'1.0\', \'2.0\', \'3.0\']; for (let i in a
    發(fā)表于 08-19 16:13

    HarmonyOS Next原生應(yīng)用開發(fā)-從TS到ArkTS的適配規(guī)則(十四)

    變量、函數(shù)參數(shù)傳遞時(shí)的逗號(hào)分隔符不同。TypeScript for (let i = 0, j = 0; i < 10; ++i, j += 2) { // ... } let x
    發(fā)表于 08-16 10:20

    HarmonyOS Next原生應(yīng)用開發(fā)-從TS到ArkTS的適配規(guī)則(十)

    。如果其中任何一個(gè)元素的類型無法根據(jù)上下文推導(dǎo)出來(例如,無類型的對(duì)象字面量),則會(huì)發(fā)生編譯時(shí)錯(cuò)誤。 TypeScript let a = [{n: 1, s: \'1\'}, {n: 2, s
    發(fā)表于 07-29 16:02

    HarmonyOS Next原生應(yīng)用開發(fā)-從TS到ArkTS的適配規(guī)則(六

    。 TypeScript class C { static s: string static { C.s = \'aa\' } static { C.s = C.s + \'bb\' } } ArkTS
    發(fā)表于 07-18 15:16