大家好肴盏,我是蘇先生科盛,一名熱愛鉆研帽衙、樂于分享的前端工程師,跟大家分享一句我很喜歡的話:人活著贞绵,其實就是一種心態(tài)厉萝,你若覺得快樂,幸福便無處不在
好文推薦
前言
前邊幾篇文章我們一共實現(xiàn)了40個工具類型谴垫,按照本專欄的規(guī)劃章母,還差59個...
本節(jié)我們繼續(xù)學(xué)習(xí)一個新的工具類型
提示
對于語法層面的知識點本系列(類型體操開頭的標(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ù)時這似乎是沒什么問題
當(dāng)為負(fù)數(shù)時丧裁,就會出現(xiàn)無限遞歸的情況了
所以抒线,還有對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如下
此時强经,再傳遞負(fù)數(shù)就不會再報錯了
則我們得到了如下的Square類型
type Square<
T extends number,
U extends any[] = GetSquareLengthArr<T>
> = U['length']
這似乎已經(jīng)大功告成了
4也好
78也好
都表現(xiàn)的還不錯??
故完整代碼如下
思考
當(dāng)嘗試輸入一個較大的數(shù)值時睡陪,得到了如下的提示。這說明我們的計算本身是沒問題的匿情,只是生成的數(shù)組太大
那有辦法解決嗎兰迫?
筆者有思路如下......
找到一個臨界值,假設(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篇類型體操,等你喲??