TypeScript類型體操--Square

大家好肴盏,我是蘇先生科盛,一名熱愛鉆研帽衙、樂于分享的前端工程師,跟大家分享一句我很喜歡的話:人活著贞绵,其實就是一種心態(tài)厉萝,你若覺得快樂,幸福便無處不在

好文推薦

前言

前邊幾篇文章我們一共實現(xiàn)了40個工具類型谴垫,按照本專欄的規(guī)劃章母,還差59個...

本節(jié)我們繼續(xù)學(xué)習(xí)一個新的工具類型

image.png

提示

對于語法層面的知識點本系列(類型體操開頭的標(biāo)題)不會展開說明哈,可以自行搜索學(xué)習(xí)其他大佬的優(yōu)質(zhì)文章或者等我后續(xù)更新補(bǔ)充

實現(xiàn)

這個工具類型實現(xiàn)的關(guān)鍵點是如何模擬乘法運(yùn)算翩剪,顯然這可以通過數(shù)組來實現(xiàn)

比如2的平方是4乳怎,可以使用數(shù)據(jù)長度來表示,即[1,2,1,4]前弯,至于數(shù)組中的元素具體是什么蚪缀,并不需要關(guān)心

了解了這一點,就很好定義其入?yún)⒘怂〕觥H缦拢琓表示一個數(shù)字,U是平方數(shù)對應(yīng)長度的數(shù)組

type Square<
    T extends number,
    U extends any[]=[]
  >

而它的結(jié)果必然是對U的長度的取值

U['length']

現(xiàn)在問題變成了U如何基于T計算特定的長度豪直,如下定義GetSquareLength來完成

type GetSquareLength<
    T extends number,
    U extends any[]=[]
  >

由于數(shù)組長度與數(shù)值T之間的關(guān)系是T??T吗伤,而能構(gòu)造的條件只與長度相關(guān)

U['length'] extends T

故,還需要第三個參數(shù)R來進(jìn)行補(bǔ)位

type GetSquareLength<
    T extends number,
    U extends any[]=[],
    R extends any[]=[]
  >

至于R的計算的畴,可以通過列舉來找規(guī)律

/**
 * U R
 * 1 0
 * 2 2
 * 3 6
 * 4 12
 * 5 20
 * 6 30
 * 7 42
 * 8 56
 */

可以看出渊抄,上一次的U的兩倍+上一次的R的值,剛好就是本次的R

/**
* U   U   R   
* 1 + 1 + 0 = 2
* 2 + 2 + 2 = 6
* 3 + 3 + 6 = 12
* 4 + 4 + 12 = 20
* 5 + 5 + 20 = 30
* 6 + 6 + 30 = 42
* 7 + 7 + 42 = 56
*/

故GetSquareLength的完整實現(xiàn)如下

type GetSquareLength<
    T extends number,
    U extends any[]=[],
    R extends any[]=[]
  > = 
  U['length'] extends T 
  ? [...U,...R] 
  : GetSquareLength<T,[1,...U],[...U,...U,...R]>

當(dāng)為正數(shù)時這似乎是沒什么問題

image.png

當(dāng)為負(fù)數(shù)時丧裁,就會出現(xiàn)無限遞歸的情況了

image.png

所以抒线,還有對T其取絕對值

type Abs<
    N extends number
  > = 
  `${N}` extends `-${infer R extends number}` 
  ? R 
  : N;

如上,當(dāng)N為2時渣慕,2-2的結(jié)果是N嘶炭,即2;當(dāng)N為-2時逊桦,-2-2的結(jié)果是R眨猎,即2

故,完整的GetSquareLength如下

image.png

此時强经,再傳遞負(fù)數(shù)就不會再報錯了

image.png

則我們得到了如下的Square類型

type Square<
    T extends number,
    U extends any[] = GetSquareLengthArr<T>
  > = U['length']

這似乎已經(jīng)大功告成了

4也好

image.png

78也好

image.png

都表現(xiàn)的還不錯??

故完整代碼如下

image.png

思考

當(dāng)嘗試輸入一個較大的數(shù)值時睡陪,得到了如下的提示。這說明我們的計算本身是沒問題的匿情,只是生成的數(shù)組太大

image.png

那有辦法解決嗎兰迫?

image.png

筆者有思路如下......

找到一個臨界值,假設(shè)是100炬称,以118為例子汁果,可拆分為

(100 + 18) * (100 + 18)

他們的結(jié)果為各項乘積的和

100 * 100  + 100 * 18 + 18 * 100 + 18 * 18

則現(xiàn)在的問題有兩個:

  • 如何拆分?

  • 如何相加玲躯?

思考一下据德,評論區(qū)討論鳄乏,或者關(guān)注我,后續(xù)揭曉哦??

下期預(yù)告

GetMiddleElement

  • 功能

獲取數(shù)組的中間元素

  • 使用示例
type case = GetMiddleElement<[1,2,3,4,5]> // 3

如果本文對您有用棘利,希望能得到您的點贊和收藏

訂閱專欄橱野,每更新1-2篇類型體操,等你喲??

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末善玫,一起剝皮案震驚了整個濱河市水援,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌茅郎,老刑警劉巖裹唆,帶你破解...
    沈念sama閱讀 218,122評論 6 505
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異只洒,居然都是意外死亡许帐,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,070評論 3 395
  • 文/潘曉璐 我一進(jìn)店門毕谴,熙熙樓的掌柜王于貴愁眉苦臉地迎上來成畦,“玉大人,你說我怎么就攤上這事涝开⊙剩” “怎么了?”我有些...
    開封第一講書人閱讀 164,491評論 0 354
  • 文/不壞的土叔 我叫張陵舀武,是天一觀的道長拄养。 經(jīng)常有香客問我,道長银舱,這世上最難降的妖魔是什么瘪匿? 我笑而不...
    開封第一講書人閱讀 58,636評論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮寻馏,結(jié)果婚禮上棋弥,老公的妹妹穿的比我還像新娘。我一直安慰自己诚欠,他們只是感情好顽染,可當(dāng)我...
    茶點故事閱讀 67,676評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著轰绵,像睡著了一般粉寞。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上左腔,一...
    開封第一講書人閱讀 51,541評論 1 305
  • 那天唧垦,我揣著相機(jī)與錄音,去河邊找鬼翔悠。 笑死业崖,一個胖子當(dāng)著我的面吹牛野芒,可吹牛的內(nèi)容都是我干的蓄愁。 我是一名探鬼主播双炕,決...
    沈念sama閱讀 40,292評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼撮抓!你這毒婦竟也來了妇斤?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,211評論 0 276
  • 序言:老撾萬榮一對情侶失蹤丹拯,失蹤者是張志新(化名)和其女友劉穎站超,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體乖酬,經(jīng)...
    沈念sama閱讀 45,655評論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡死相,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,846評論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了咬像。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片算撮。...
    茶點故事閱讀 39,965評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖县昂,靈堂內(nèi)的尸體忽然破棺而出肮柜,到底是詐尸還是另有隱情,我是刑警寧澤倒彰,帶...
    沈念sama閱讀 35,684評論 5 347
  • 正文 年R本政府宣布审洞,位于F島的核電站,受9級特大地震影響待讳,放射性物質(zhì)發(fā)生泄漏芒澜。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,295評論 3 329
  • 文/蒙蒙 一创淡、第九天 我趴在偏房一處隱蔽的房頂上張望撰糠。 院中可真熱鬧,春花似錦辩昆、人聲如沸阅酪。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,894評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽术辐。三九已至,卻和暖如春施无,著一層夾襖步出監(jiān)牢的瞬間辉词,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,012評論 1 269
  • 我被黑心中介騙來泰國打工猾骡, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留瑞躺,地道東北人敷搪。 一個月前我還...
    沈念sama閱讀 48,126評論 3 370
  • 正文 我出身青樓,卻偏偏與公主長得像幢哨,于是被迫代替她去往敵國和親赡勘。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,914評論 2 355

推薦閱讀更多精彩內(nèi)容