精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

TypeScript 之痛,為啥很多人會(huì)用成 AnyScript

開(kāi)發(fā) 前端
TypeScript 作為類(lèi)型約束的語(yǔ)言,在套在強(qiáng)調(diào)類(lèi)型靈活性的 JavaScript 上時(shí),在實(shí)際的使用過(guò)程中是有非常多的鎮(zhèn)痛的,甚至有很多即使用了類(lèi)型體操都無(wú)法解決的問(wèn)題,因?yàn)樗麄儚牡讓颖举|(zhì)上來(lái)說(shuō),確實(shí)有許多無(wú)法統(tǒng)一的邏輯和場(chǎng)景。

簡(jiǎn)單給大家說(shuō)一下案例背景。

我在寫(xiě)我的付費(fèi)專(zhuān)欄「圖解算法」時(shí),準(zhǔn)備基于拉鏈法實(shí)現(xiàn)一個(gè) HashMap 對(duì)象,并且準(zhǔn)備用環(huán)形鏈表來(lái)存儲(chǔ)碰撞到一起的輸入值。

完整的存儲(chǔ)結(jié)果,大家可以通過(guò)上圖來(lái)理解。

?

由于環(huán)形鏈表的算法結(jié)構(gòu),在 React 底層原理中被大量運(yùn)用,因此,是大廠面試的高頻考題之一。而哈希碰撞 + 環(huán)形鏈表則是一個(gè)綜合性較強(qiáng)的場(chǎng)景,是一個(gè)考察高級(jí)開(kāi)發(fā)候選人的基礎(chǔ)是否扎實(shí)的比較合適的題目,各位面試官也可以借鑒

然而,在實(shí)現(xiàn)這個(gè)代碼的過(guò)程中,我卻在一個(gè) TypeScript 的類(lèi)型問(wèn)題上遇到了麻煩。

按照既有的思路,我首先需要定義一個(gè)鏈表節(jié)點(diǎn)的類(lèi)型,該節(jié)點(diǎn)存儲(chǔ) key-value 鍵值對(duì)。這里由于 Map 支持的 key 值是任意類(lèi)型,value 的類(lèi)型也不確定,因此,我的本能反應(yīng),就是使用 any 來(lái)約定類(lèi)型,然后再加一個(gè)指向下一個(gè)節(jié)點(diǎn)的指針 next

type HNode = {
  key: any,
  value: any,
  next: HNode | null
}

但是很明顯啊,直接用 any 肯定是不那么專(zhuān)業(yè)的,因此呢,我就不得不花額外的精力去思考到底應(yīng)該用什么樣的類(lèi)型比較合適。

由于 key-value 都是從外部傳入的,因此比較標(biāo)準(zhǔn)一點(diǎn)的做法,是可以傳入泛型變量來(lái)站位

可以改造成這樣

type HNode<K, V> = {
  key: K,
  value: V,
  next: HNode<K, V> | null
}

但是,改造成這樣之后呢,麻煩的事情就來(lái)了。他與 Map 的語(yǔ)法定義就不匹配了。為啥我要這么說(shuō)呢?

我們都知道,在使用 Map 的時(shí)候,如果我們傳入兩個(gè) key-value 的值進(jìn)來(lái),這兩個(gè)鍵值對(duì)的 key 類(lèi)型與 value 類(lèi)型,在語(yǔ)法上,是沒(méi)有強(qiáng)制要求他們必須是相同的。

例如,在同一個(gè) Map 中,我們可以分別存儲(chǔ)如下兩個(gè)鍵值對(duì)

const m = new Map<any, any>()
m.set('tom', {})
m.set(1024, 'hello world!')

但是,我們一旦用泛型來(lái)約束之后,這樣寫(xiě)就難受了呀,最終還是只能傳入 any 才能解決問(wèn)題。

當(dāng)然,這是一方面,另外一方面,你會(huì)發(fā)現(xiàn),一個(gè)簡(jiǎn)單的場(chǎng)景,為了解決類(lèi)型問(wèn)題,你又多花了大量的時(shí)間。要完美解決的話(huà),又得引入重載,這運(yùn)用成本就嘎嘎嘎的往上升。

最后發(fā)現(xiàn),還是 any 省事兒!

后面還有一個(gè)場(chǎng)景,如下代碼所示,我在編寫(xiě) set 方法,先簡(jiǎn)單瞄一眼代碼,后面再分析。

// 插入鍵值對(duì)
set(key: K, value: V) {
  const index = this.hash(key);
  const bucket = this.buckets[index]

  const node: HNode<K, V> = {
    key: key,
    value: value,
    next: null
  }

  // 如果桶是空的,初始化一個(gè)鏈表
  if (!bucket) {
    node.next = node
    this.buckets[index] = {
      length: 1,
      last: node
    };
    return
  }

  const last = bucket.last
  const first = last?.next

  // 檢查是否已存在相同的key
  let current: HNode<K, V> = bucket.last
  while(true) {
    if (current.key === key) {
      current.value = value
    }
    current = current.next
    if (current === bucket.last) {
      break
    }
  }

  // add the node to last
  last.next = node
  node.next = first
  bucket.last = node
  bucket.length += 1
}

set 的語(yǔ)法如下

const m = new HashMap()
m.set(1001, {})

在底層實(shí)現(xiàn)中,由于我們需要將鍵值對(duì)插入到鏈表中,因此在插入之前,就需要先定義好節(jié)點(diǎn)。這里的一個(gè)問(wèn)題就是,我這個(gè)節(jié)點(diǎn)的指針類(lèi)型的值,應(yīng)該是什么?

默認(rèn)理所應(yīng)當(dāng)應(yīng)該是 null,因此此時(shí)還不知道會(huì)指向誰(shuí)呢?

const node: HNode<K, V> = {
  key: key,
  value: value,
  next: null
}

但是,真實(shí)的場(chǎng)景是,由于我們使用的是環(huán)形鏈表,因此這里的 next 實(shí)際上是總有值的,最差也是指向自身。只要有節(jié)點(diǎn)存在,他就不可能為 null

node.next = node

因此,如何要和實(shí)際情況匹配的話(huà),我們就不應(yīng)該將其設(shè)置為 null。

但是由于在初始化時(shí),語(yǔ)法不允許直接指向自身,所以這里就不得不先將其設(shè)置為 null,在根據(jù)條件判斷來(lái)確定指向

但是,這就會(huì)引發(fā)后續(xù)的麻煩,后續(xù)當(dāng)我要獲取一個(gè)節(jié)點(diǎn)時(shí),由于真實(shí)情況是,我一定能獲取到一個(gè)節(jié)點(diǎn),不會(huì)存在獲取到為 null 的情況,但是由于我們?cè)陬?lèi)型的定義上,將其設(shè)置為了 null,這個(gè)時(shí)候,就不得不額外處理獲取值為 null 的情況

這特么代碼寫(xiě)起來(lái)就賊難受。

我就只能用 as 來(lái)強(qiáng)制約定類(lèi)型

current = current.next as HNode<K, V>

或者干脆就直接在定義的時(shí)候,全給寫(xiě)成 any,就啥麻煩事兒都沒(méi)有了

type HNode = {
  key: any,
  value: any,
  next: any
}

總結(jié)

TypeScript 作為類(lèi)型約束的語(yǔ)言,在套在強(qiáng)調(diào)類(lèi)型靈活性的 JavaScript 上時(shí),在實(shí)際的使用過(guò)程中是有非常多的鎮(zhèn)痛的,甚至有很多即使用了類(lèi)型體操都無(wú)法解決的問(wèn)題,因?yàn)樗麄儚牡讓颖举|(zhì)上來(lái)說(shuō),確實(shí)有許多無(wú)法統(tǒng)一的邏輯和場(chǎng)景。

這是許多人把 ts 用成 anyScript 的原因。

當(dāng)然,適當(dāng)使用 any,絕對(duì)不是技術(shù)水平不行的表現(xiàn)。我們要學(xué)會(huì)在使用成本和類(lèi)型約束之間,做一個(gè)合適的取舍。一方面我們要適當(dāng)約束 JS 的靈活性以迎合 TS 的規(guī)則,另外一方面,我們也要適當(dāng)使用 any 釋放 TS 的靈活性,來(lái)降低開(kāi)發(fā)成本。否則,我們的開(kāi)發(fā)體感就會(huì)變得很差,會(huì)被 TypeScript 搞的很難受。

責(zé)任編輯:姜華 來(lái)源: 這波能反殺
相關(guān)推薦

2019-12-09 10:02:41

泛型ypeScript前端

2025-02-21 08:48:16

Typescript內(nèi)置聯(lián)合類(lèi)型

2024-09-12 08:32:42

2021-01-30 11:42:53

迭代器代碼元素

2022-02-06 00:07:19

互聯(lián)網(wǎng)失業(yè)職業(yè)

2018-02-13 14:48:17

戴爾

2021-10-08 15:50:14

手機(jī)屏幕安卓

2017-12-13 15:57:12

2022-07-06 10:33:39

技術(shù)債務(wù)CIO

2019-08-21 08:24:34

技術(shù)過(guò)濾器代碼

2021-06-24 09:08:34

Java代碼泛型

2020-06-29 08:28:36

v-for 解構(gòu)函數(shù)

2020-11-16 11:24:00

Spring AOP數(shù)據(jù)庫(kù)

2014-05-09 15:29:21

2021-01-15 05:39:13

HashMapHashTableTreeMap

2020-06-08 19:16:52

大數(shù)據(jù)IT技術(shù)

2021-02-22 13:14:00

計(jì)算機(jī)編程技術(shù)

2021-09-21 10:33:56

人工智能科學(xué)技術(shù)

2022-01-05 23:34:02

顯示器濾藍(lán)光LED

2019-08-08 16:00:08

HTTPGETPOST
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)

亚洲黄色片在线观看| 免费看欧美美女黄的网站| 精品免费日韩av| 五十路熟女丰满大屁股| 理论视频在线| 精品午夜久久福利影院| 97免费中文视频在线观看| 人妻少妇无码精品视频区| 精品99re| 欧美自拍偷拍午夜视频| 777久久精品一区二区三区无码| 同心难改在线观看| 黄页视频在线91| 91精品国产高清久久久久久久久| 国产又粗又猛又爽又黄的视频四季| 99精品在免费线中文字幕网站一区 | 欧美视频二区36p| 亚洲欧美一区二区原创| 可以免费观看的毛片| 日本美女一区二区三区视频| 久久久女女女女999久久| 亚洲一级黄色录像| 欧美日韩精品一区二区三区在线观看| 欧美日韩夫妻久久| 黄www在线观看| 四虎亚洲精品| 亚洲欧美中日韩| 日韩高清三级| 天堂视频中文在线| 国产成人av自拍| 成人精品久久久| 中文字幕xxxx| 国产精品视频久久一区| 欧美日韩ab片| 性欧美疯狂猛交69hd| 奇米亚洲欧美| 国产视频久久久久| 中国xxxx性xxxx产国| 精品一区二区三区亚洲| 欧美日韩另类一区| 黄色三级视频片| 三级成人黄色影院| 黑人欧美xxxx| 自慰无码一区二区三区| 538视频在线| 亚洲国产精品一区二区久久| 国产在线拍揄自揄拍无码| 日本中文字幕在线观看| 国产精品丝袜黑色高跟| 日本不卡一区二区三区视频| 免费在线观看污视频| av中文一区二区三区| 成人永久免费| 黄色av免费观看| 成人中文字幕合集| 国产精品一码二码三码在线| 成人午夜福利视频| 成人福利电影精品一区二区在线观看| 成人av播放| 成人av无码一区二区三区| 国产乱子轮精品视频| 91丝袜美腿美女视频网站| 97精品久久人人爽人人爽| 国产一区二区三区综合| 亚洲最大av网| 免费国产羞羞网站视频| 99精品在线观看视频| 久久国产主播精品| 国外av在线| 专区另类欧美日韩| 欧美精品在欧美一区二区| 不卡av免费观看| 欧美性高跟鞋xxxxhd| 午夜视频在线瓜伦| 亚洲最大的免费视频网站| 欧美一级黄色片| 中文字幕在线视频播放| 欧美**vk| 久久精品国产清自在天天线 | 无码人妻精品一区二区三| 日韩精品导航| 一区国产精品视频| 天天综合天天做| aa级大片欧美三级| 国产精品电影在线观看| 国产伦理一区二区| 99久久综合精品| 一区二区精品在线| 亚洲图区一区| 日韩欧美在线视频观看| 亚洲va在线va天堂va偷拍| 亚洲1区在线| 亚洲色在线视频| 欧美偷拍第一页| 国产精品久久777777毛茸茸| 国产精品视频999| 粉嫩小泬无遮挡久久久久久| 久久久影院官网| 人人妻人人澡人人爽精品欧美一区| 后进极品白嫩翘臀在线播放| 91精品办公室少妇高潮对白| 97人人模人人爽人人澡| 久久99国内| 萌白酱国产一区二区| 亚洲婷婷综合网| 国产精品资源在线看| 久久久久久久久一区| 麻豆影视在线观看_| 欧美香蕉大胸在线视频观看| 亚洲一区二区偷拍| 亚洲女娇小黑人粗硬| 欧美美女15p| 亚洲精品欧美极品| 成年人视频网站免费观看| 欧美成人精品三级网站| 日韩视频一区二区在线观看| 91网站免费视频| 亚洲午夜极品| 成人精品一区二区三区| 人人九九精品| 亚洲国产精品久久一线不卡| 成人亚洲精品777777大片| 狼人天天伊人久久| 欧美老少做受xxxx高潮| 一区二区视频免费| 国产日韩欧美高清在线| 成人黄色av片| 成人h动漫免费观看网站| 久久韩剧网电视剧| 在线观看毛片网站| 中文字幕欧美激情| 成人3d动漫一区二区三区| 私拍精品福利视频在线一区| 欧美国产一区二区三区| 国产精品一区二区免费视频| 国产精品无人区| 亚洲五月天综合| 精品视频国产| 国产精品第2页| 国产午夜在线视频| 色婷婷国产精品| 亚洲中文字幕无码一区| 欧美日韩18| 产国精品偷在线| 岛国毛片av在线| 亚洲缚视频在线观看| 久久免费视频99| 成人激情小说网站| 欧美一级免费播放| 麻豆国产欧美一区二区三区r| 欧美激情在线播放| 人妻无码一区二区三区久久99| 亚洲一区二区偷拍精品| 黄色性视频网站| 99热免费精品| 日韩av电影免费在线观看| 影视一区二区三区| 中文字幕在线日韩 | 激情无码人妻又粗又大| 久久精品国产色蜜蜜麻豆| 一级日韩一区在线观看| 99精品女人在线观看免费视频| 超碰精品一区二区三区乱码| 99视频在线观看免费| 亚洲综合男人的天堂| www.com日本| 波多野结衣免费观看| 久久精品色综合| 欧美一级电影在线| www.亚洲视频| 欧美一区二区三区在线观看 | 国产中文在线视频| 在线区一区二视频| 四虎永久免费地址| 国产电影精品久久禁18| www国产精品内射老熟女| 狠狠色丁香婷婷综合影院| 国产在线观看精品一区二区三区| 日本孕妇大胆孕交无码| 亚洲精品美女久久| 中文字幕av第一页| 亚洲精品福利视频网站| www.久久国产| 极品少妇一区二区| 国产午夜大地久久| 日韩欧美精品综合| 999视频在线免费观看| 亚洲天堂导航| 久久中文字幕一区| 日韩福利一区二区| 欧美一区二区三区视频在线观看| 日韩精品在线不卡| 日本一区二区免费在线| 中国极品少妇xxxx| 蜜臀91精品一区二区三区| 欧美国产综合在线| 日韩成人精品一区| 国产精品区一区| 国产精品亚洲成在人线| 高清一区二区三区日本久| 成人午夜影视| 日韩免费视频线观看| 免费一级a毛片| 五月天一区二区| 亚洲伦理一区二区三区| 久久综合五月天婷婷伊人| 久久久久久国产精品日本| 老司机精品久久| 久久久久久人妻一区二区三区| 波多野结衣一区| 精品国产免费久久久久久尖叫| 成人97精品毛片免费看| 日韩免费在线视频| 成人在线高清免费| 美乳少妇欧美精品| 欧美69xxxx| 一区二区三区在线播放欧美| 污污的视频网站在线观看| 91精品国产乱| 在线观看免费观看在线| 色综合久久久久综合99| 国产无精乱码一区二区三区| 亚洲欧美日韩一区二区| 国产精品综合激情| 久久久久国产精品麻豆| xxxxxx黄色| 成人免费毛片app| 69久久精品无码一区二区| 久久精品国产一区二区| 91蝌蚪视频在线观看| 久久精品亚洲一区二区| 亚洲国产精品久久久久婷蜜芽 | 日本在线观看a| 亚洲乱亚洲高清| www.av蜜桃| 黄色日韩在线| 久久99中文字幕| 影音国产精品| 免费在线观看视频a| 国色天香一区二区| 久久99久久久久久| 激情偷拍久久| 亚洲美免无码中文字幕在线 | 国产伊人精品在线| av成人在线看| 国产日韩av在线| 日本午夜免费一区二区| 国产欧美在线观看| 在线观看欧美| 亚洲综合日韩在线| 日韩在线精品强乱中文字幕| 亚洲一区国产精品| 538任你躁精品视频网免费| www 成人av com| 精品国产影院| 久久精品国产一区二区三区日韩| 午夜欧洲一区| 色噜噜狠狠一区二区三区| 欧美成人自拍| 日韩极品视频在线观看| 亚洲久久成人| 亚洲免费av一区二区三区| 免费成人在线观看| 久久精品一卡二卡| 国产成人综合精品三级| 久久久老熟女一区二区三区91| 99re视频精品| 少妇视频在线播放| 亚洲色图清纯唯美| 国产精品99无码一区二区| 大桥未久av一区二区三区| 在线观看亚洲黄色| 91精品国产91热久久久做人人 | 在线观看日韩av| 快射av在线播放一区| 欧美激情videoshd| 色偷偷偷在线视频播放| 国产精品久在线观看| 国产日本亚洲| 欧美国产一二三区| 亚洲一级毛片| 各处沟厕大尺度偷拍女厕嘘嘘| 奇米精品一区二区三区四区| 永久免费看片在线观看| 91蜜桃视频在线| 黄色录像一级片| 精品国产乱码久久久久酒店 | 麻豆国产欧美日韩综合精品二区 | 欧美高清自拍一区| 久久青青视频| 亚洲自拍偷拍视频| 久久99久久人婷婷精品综合 | 无码人中文字幕| 亚洲一区二区三区不卡国产欧美| 中文字幕一区在线播放| 欧美一卡二卡三卡| 久久免费看视频| 欧美国产日韩一区二区| 欧美高清免费| 久久国产主播精品| 欧美69视频| 天天视频天天爽| 99国产精品视频免费观看| 麻豆视频在线免费看| 在线观看成人免费视频| 黄色一级大片在线免费看国产一| 日韩在线视频网站| 嗯~啊~轻一点视频日本在线观看| 国产美女久久久| 蜜臀av免费一区二区三区| 成人在线免费观看视频网站| 青娱乐精品在线视频| 欧洲一级黄色片| 亚洲一区二区三区四区在线| 亚洲一区二区三区网站| 亚洲欧美综合精品久久成人| 不卡的av影片| 99在线视频首页| 亚洲高清资源在线观看| 亚洲精品一二三四五区| 99re8在线精品视频免费播放| 欧美另类视频在线观看| 欧美精品少妇一区二区三区| 久久精品国产亚洲a∨麻豆| 91国在线精品国内播放| 91国内精品| 水蜜桃在线免费观看| 久久精品国产99国产| 国产亚洲精品熟女国产成人| 高跟丝袜欧美一区| 人妻中文字幕一区| 欧美激情网站在线观看| 亚洲精品午夜| 水蜜桃在线免费观看| 国产一区二区三区日韩| 欧美肥妇bbwbbw| 欧美精品乱码久久久久久按摩| av免费在线一区二区三区| 国产成人精品免高潮在线观看| 色天下一区二区三区| 欧美 日韩 国产 高清| 北岛玲一区二区三区四区| 国产一级大片在线观看| 精品国产电影一区二区| 97天天综合网| 精品国产免费久久久久久尖叫| 国产亚洲精品自拍| 精品无码在线视频| 欧美色另类天堂2015| 免费在线视频你懂得| 国产精品va在线播放| 欧美日韩一二三四| 亚洲一级免费观看| 国产精品久久国产精麻豆99网站| 91精品国产乱码久久久| 久久精品国产2020观看福利| av在线国产精品| 强开小嫩苞一区二区三区网站| 国产成人a级片| 欧美日韩一二三四区| 亚洲一区999| 四虎影视国产精品| 男人的天堂视频在线| 成人午夜私人影院| 久久青青草原亚洲av无码麻豆| 在线视频日本亚洲性| 青青在线精品| youjizz.com在线观看| 99re视频这里只有精品| 奴色虐av一区二区三区| 久久久成人精品| 国产欧美一区二区三区米奇| 国产日韩一区二区在线| 国产精品色噜噜| 亚洲第一页综合| 国产91色在线播放| 久久久久久久久99精品大| yjizz视频| 欧美在线免费视屏| av免费在线观| 欧美影视一区二区| 国产精选一区二区三区| 国产专区第一页| 久久久999成人| 日本午夜精品| 天天看片天天操| 午夜欧美2019年伦理| avav免费在线观看| 国产精品久久亚洲7777| 免费成人av资源网| 国产精品免费av一区二区| 一本色道久久综合亚洲精品小说 | 美女视频一区| 国产91沈先生在线播放| 久久久精品一品道一区| a级片在线视频| 国产精品老女人精品视频| 影音先锋久久久| 登山的目的在线| 亚洲色图18p|