精品欧美一区二区三区在线观看 _久久久久国色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| 波多野结衣欧美| 在线观看精品一区| 久久久久久久久网| 无码国产精品高潮久久99| 国产亚洲激情| 久久这里只有精品99| 色婷婷免费视频| 欧美一区=区三区| 午夜精品影院在线观看| 日韩av影视| 午夜美女福利视频| 日韩一区欧美二区| 久久久久久69| 亚洲女人毛茸茸高潮| 久久影视三级福利片| 欧美精品在线观看一区二区| 国产一区二区网| 久草免费在线| 久久蜜桃av一区精品变态类天堂 | 亚洲免费福利| 一区二区三区日韩欧美精品| 视频一区三区| 午夜福利一区二区三区| 国产精品影视在线| 国产精品日日做人人爱| 亚洲精品男人的天堂| 亚洲91精品| 中文字幕日韩高清| 亚洲 欧美 日韩在线| 精品视频在线观看网站| 欧美午夜一区二区三区免费大片| 日本中文字幕网址| 日韩三级电影视频| 亚洲人成网站在线| 亚洲欧美丝袜| 成人在线免费看| 久久亚洲二区三区| 久久久久高清| 色呦呦免费观看| 福利电影一区二区三区| 91影院未满十八岁禁止入内| 亚洲怡红院av| 久久福利视频一区二区| 国产精品99久久久久久人| www..com国产| 国产日韩亚洲| 2019亚洲日韩新视频| 日本少妇在线观看| 亚洲一级一区| 久久久久久久久久久国产| 国产波霸爆乳一区二区| 欧美a级在线| 欧美另类极品videosbestfree| 久久视频一区二区三区| 成人av动漫在线观看| 亚洲精品一区久久久久久| free性中国hd国语露脸| 欧美午夜寂寞| 亚洲欧美在线磁力| av电影网站在线观看| 成人黄色小视频| 色偷偷888欧美精品久久久| 人成免费在线视频| 亚洲国产精品日韩专区av有中文| 久久成人国产精品| 精品无码人妻一区二区三区| 99精品国产在热久久下载| 97av在线影院| 看黄色一级大片| 久久成人精品无人区| 91久久爱成人| 少妇荡乳情欲办公室456视频| 99国产欧美久久久精品| 欧美福利一区二区三区| 不卡在线视频| 伊人夜夜躁av伊人久久| 久久久久久久久久网| 中文字幕人成乱码在线观看| 在线这里只有精品| 国产精品自在自线| 91麻豆精品激情在线观看最新 | 日精品一区二区| 国产日韩在线播放| 亚洲毛片欧洲毛片国产一品色| 99久久久国产精品免费蜜臀| 日韩免费毛片| av小次郎在线| 一本大道综合伊人精品热热| 国产日韩欧美久久| 成人18夜夜网深夜福利网| 精品中文视频在线| 欧美三级黄色大片| 99香蕉国产精品偷在线观看| 国产欧美精品一区二区三区-老狼| 国产免费视频一区二区三区| 91碰在线视频| 欧美黄色免费网址| 三级成人黄色影院| 日韩精品影音先锋| 成人免费毛片糖心| 欧美午夜不卡| 国产精品成人播放| 亚洲乱码在线观看| 国产女人水真多18毛片18精品视频| av日韩在线看| 久久久久黄色| 亚洲美女福利视频网站| 三级影片在线看| 视频一区欧美精品| 国产精品一区二区欧美黑人喷潮水 | av在线视屏| 欧美精品v日韩精品v韩国精品v| 欧美一区二区免费在线观看| 欧美一区精品| 国产精品视频一| 午夜视频www| 一区二区三区小说| 在线不卡一区二区三区| 宅男在线一区| 26uuu国产精品视频| 亚洲第一成人av| 成人免费在线视频观看| 国产情侣av自拍| 日韩a级大片| 久久久中文字幕| www.爱爱.com| 亚洲婷婷综合久久一本伊一区| 91淫黄看大片| 欧美亚洲tv| 91精品国产91久久久久久| 精品国自产在线观看| 中文字幕一区av| 久久综合伊人77777麻豆最新章节| 欧美一级三级| 国产91成人video| 色综合免费视频| 亚洲va天堂va国产va久| 扒开伸进免费视频| 国内一区二区三区| 91文字幕巨乱亚洲香蕉| 中文字幕有码在线视频| 5月丁香婷婷综合| 午夜精品久久久久99蜜桃最新版| 蜜桃免费网站一区二区三区 | 在线中文一区| 95av在线视频| 色www永久免费视频首页在线| 日韩免费视频一区二区| 欧美三级免费看| 国产精一区二区三区| av久久久久久| www.丝袜精品| 8x拔播拔播x8国产精品| 视频国产在线观看| 欧美午夜片欧美片在线观看| 国产男女猛烈无遮挡a片漫画| 性欧美长视频| 一区不卡字幕| 日本精品视频| 国外成人在线视频| 日韩av视屏| 在线亚洲欧美专区二区| 国产主播av在线| 国产麻豆精品一区二区| 拔插拔插海外华人免费| 婷婷亚洲成人| 国产精品自产拍在线观看中文| 免费黄色在线| 337p日本欧洲亚洲大胆色噜噜| 国产精品白浆一区二小说| 26uuu精品一区二区三区四区在线| 成年人在线看片| 国产精品99久久久久久动医院| 91久久精品一区二区别| 国产高清视频色在线www| 亚洲免费伊人电影在线观看av| 久草热在线观看| 亚洲黄色小视频| 欧美多人猛交狂配| 激情综合色丁香一区二区| 人妻无码久久一区二区三区免费| 亚洲精品中文字幕99999| 国产欧美久久久久久| 麻豆福利在线观看| 亚洲片av在线| 99精品久久久久久中文字幕| 欧美日韩午夜剧场| 色偷偷www8888| 99在线视频精品| 不卡的av中文字幕| 日韩视频精品在线观看| 一区二区视频在线免费| 国产成人高清精品免费5388| 国产成人在线一区二区| 大黄网站在线观看| 夜夜嗨av一区二区三区四区| 亚洲产国偷v产偷v自拍涩爱| 欧美亚洲动漫制服丝袜| 国产一二三四在线| 国产精品情趣视频| 国产精品久久AV无码| 国内精品免费**视频| 无码日韩人妻精品久久蜜桃| 国产在线成人| 正在播放亚洲| 国产区精品区| 国内精品久久久久久久果冻传媒| 祥仔av免费一区二区三区四区| 欧美一区二区.| 中文字幕在线观看播放| 日韩在线免费视频| 午夜在线观看视频18| 欧美一区二区三区人| 这里只有精品免费视频| 懂色av影视一区二区三区| 国产女片a归国片aa| 中文字幕高清不卡| 色欲av无码一区二区三区| 国产91精品露脸国语对白| 三级一区二区三区| 青娱乐精品视频在线| 日韩有码免费视频| 国产一级久久| 日本丰满少妇xxxx| 狠狠88综合久久久久综合网| 中文字幕一区二区三区乱码| 日韩精品久久| 亚洲视频在线二区| 精品视频免费| 日本亚洲导航| 国产精品片aa在线观看| 欧美影视一区二区| 九九免费精品视频在线观看| 精品一区二区三区国产| 国内精品免费| 国产精品久久九九| 黑人久久a级毛片免费观看| 成人看片视频| 4438全国亚洲精品观看视频| www 成人av com| 一区二区三区在线资源| 99精品国产一区二区| 亚洲精品福利| 不卡日韩av| 国产丝袜一区| 精品乱子伦一区二区三区| 日韩人体视频| 日本不卡一区| 成人三级视频| 婷婷视频在线播放| 91精品福利| 草草草视频在线观看| 亚洲调教视频在线观看| 成人免费观看cn| 亚洲专区一区二区三区| 欧美性猛交久久久乱大交小说| 日本中文字幕不卡| 国产一级片自拍| 国产成人免费在线观看| 国产xxxx视频| 久久久亚洲高清| 美国一级黄色录像| 亚洲精品ww久久久久久p站| 久久精品国产亚洲AV无码男同| 精品久久久久久国产| 日韩电影在线观看一区二区| 欧美美女一区二区在线观看| 精品人妻伦一区二区三区久久| 亚洲国产精品成人一区二区| 久久精品蜜桃| 久久久国产成人精品| 丁香花在线高清完整版视频| 日产精品久久久一区二区福利| 色狠狠一区二区三区| 91丨九色丨国产| 综合色就爱涩涩涩综合婷婷| 中文字幕在线乱| 在线亚洲一区| 色啦啦av综合| 97se亚洲国产综合在线| 日韩一级片在线免费观看| 亚洲精品亚洲人成人网在线播放| 欧美a∨亚洲欧美亚洲| 欧美三级在线看| 成人久久久精品国产乱码一区二区| 亚洲老头老太hd| 成人在线影视| 日韩免费观看网站| 日韩视频一二区| 日韩经典在线视频| 好吊日精品视频| 182午夜在线观看| 99精品国产热久久91蜜凸| 欧美人与禽zoz0善交| 精品国产老师黑色丝袜高跟鞋| 97国产精品久久久| 精品性高朝久久久久久久| 韩国中文字幕在线| 国产成人97精品免费看片| 亚洲视频精选| 亚洲巨乳在线观看| 国产精品入口66mio| 无码人妻丰满熟妇区毛片蜜桃精品| 久久精品亚洲麻豆av一区二区| 久久久久成人网站| 欧美军同video69gay| 韩国三级av在线免费观看| 欧美黑人又粗大| www.久久久久爱免| 五月婷婷综合色| 国产精品免费看| 午夜免费福利影院| 亚洲人吸女人奶水| 在线视频你懂得| 亚洲午夜久久久影院| hd国产人妖ts另类视频| 114国产精品久久免费观看| 欧美激情777| 另类小说色综合| 久久精品无码一区二区三区| 国产女同在线观看| 欧美va亚洲va| 性爱视频在线播放| 成人激情视频免费在线| 成人亚洲一区| 亚洲一区二区三区四区五区xx| www久久精品| 亚洲天堂一区在线观看| 日韩精品在线观| 日韩脚交footjobhd| 国产精品亚洲综合| 伊人成年综合电影网| 国产欧美视频一区| 亚洲综合清纯丝袜自拍| 超碰在线人人干| 久久99热这里只有精品国产| 欧美高清一级片| 337p亚洲精品色噜噜狠狠p| 国产不卡在线视频| 久久伊人成人网| 亚洲国产精品字幕| yellow字幕网在线| 久久99精品久久久久久三级| 国产人成精品一区二区三| 亚洲国产果冻传媒av在线观看| 午夜电影网一区| 日本成人一区| 国产成人在线视频| 国产精品传媒精东影业在线 | 91婷婷韩国欧美一区二区| 国产成人精品一区二三区| 精品亚洲aⅴ在线观看| 日本欧美一区| 三年中国中文在线观看免费播放| 久久99久久99小草精品免视看| 在线免费观看亚洲视频| 欧美videos中文字幕| 极品av在线| 日日夜夜精品网站| 紧缚捆绑精品一区二区| 黄色一级视频在线观看| 日韩精品中文字幕久久臀| 日本精品另类| 老司机午夜免费福利视频| 不卡的电视剧免费网站有什么| 午夜影院免费在线观看| 中文欧美日本在线资源| 欧一区二区三区| 国产精品沙发午睡系列| 国产精品嫩草影院com| 国产黄色av片| 欧美专区在线视频| 91欧美国产| 欧美熟妇精品一区二区蜜桃视频| 色老汉av一区二区三区| 国产鲁鲁视频在线观看特色| 国产精品一区免费观看| 日韩在线观看一区二区| 激情五月婷婷在线| 亚洲免费av电影| 偷拍自拍亚洲| 欧美视频在线播放一区| 国产精品毛片高清在线完整版| 亚洲国产视频一区二区三区| 国产精品69久久| 欧美久久影院| 免费福利视频网站| 精品日韩一区二区| 视频在线日韩| 日韩精品一区在线视频| 国产精品福利一区二区| 亚洲av成人精品一区二区三区在线播放 | 国产一区二区成人久久免费影院 | 我要看黄色一级片| 国产视频亚洲精品|