欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

TypeScript類型實現(xiàn)加減乘除詳解

 更新時間:2023年04月14日 14:06:28   作者:嘉琪coder  
這篇文章主要為大家介紹了TypeScript類型實現(xiàn)加減乘除示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪

引言

在網(wǎng)上看到這道題目:請用TS類型實現(xiàn)整除?

type A = Divide<1, 0> // never
type B = Divide<4, 2> // 2
type C = Divide<10, 3> // 3

看完題目,我真的毫無思路,TS類型還能實現(xiàn)除法???一臉懵逼的我認真地研究了一位叫做  JoeYan大佬的解答:

type Tuple<T extends number, U extends any[] = []> =
    U['length'] extends T ? U : Tuple<T, [...U, any]>
type Subtract<
    A extends number,
    B extends number
> = Tuple<A> extends [...Tuple<B>, ...infer R] ? R['length'] : never
type SmallerThan<
    A extends number,
    B extends number,
    S extends any[] = []
> = S['length'] extends B
    ? false
    : S['length'] extends A
    ? true
    : SmallerThan<A, B, [...S,A]>
type Divide<A extends number, B extends number, S extends any[] = []> =
    B extends 0 ? never : SmallerThan<A, B> extends true ? S['length'] : Divide<Subtract<A, B>, B, [...S, any]>;
type res = Divide<200, 10> // 20

分析

乍一看,真的驚呆了,但是一步一步分析,還是能夠看懂的,本文將整個研究的過程記錄了下來:

TS類型沒有直接提供數(shù)字的加減乘除,所以這位大佬的減法和整除都是通過數(shù)組長度計數(shù)來實現(xiàn)的。我平時體操練習很少,在沒看他的解答前,我永遠不會想到還能這么玩兒。

Divide

如果要實現(xiàn)98%10,假設(shè)A是98,B是10,讓A一直減B,直到A小于B,無法繼續(xù)再減,就能得到整除的結(jié)果。

A能減去9次B,每次進行減10的時候,往S(用來計數(shù)的數(shù)組,初始值為空數(shù)組)里面push一個元素。A減去9次10后,S數(shù)組的長度是9。此時A是8,B是10,A小于B,返回S的長度9。

type Divide<A extends number, B extends number, S extends number[] = []> =
    B extends 0 ? never : SmallerThan<A, B> extends true ? S['length'] : Divide<Subtract<A, B>, B, [...S, any]>;

上面這段代碼的字面意思是:

  • B是否為0,直接返回never
  • A如果小于B,返回S的長度
  • A如果大于B,我們執(zhí)行A-B,然后我們給S數(shù)組push一個元素,再次計算Divide

接下來,讓我們開始逐個分析。

SmallerThan

SmallerThan用于判斷A是否小于B

type res = SmallerThan<10,2>  // res為false
type res = SmallerThan<2,20> // res為true
type SmallerThan<
    A extends number,
    B extends number,
    S extends any[] = []
> = S['length'] extends B
    ? false
    : S['length'] extends A
    ? true
    : SmallerThan<A, B, [...S,any]>

字面上看起來是:

  • S的長度等于B,返回false
  • S的長度不等于B且S的長度等于A,返回true
  • S的長度不等于A和B,將any推入S數(shù)組

接下來舉例來看:

type res = SmallerThan<3,2>  
// 首先S['length']=0 ,所以不等于A和B,此時將any推入數(shù)組,S數(shù)組變成[any]
// 接下來S['length'] =1,還是B等于A和B,此時繼續(xù)將A放入數(shù)組,S數(shù)組變成[any,any]
// 此時S['length'] = 2,所以得出S的長度等于B,返回false

總之,S的長度是一次一次的累加的,先等于誰的長度,誰就更小。 如果S的長度先等于B的長度,那么就是A>B。如果S的長度先等于A的長度,就是A<B

Tuple

作用是將數(shù)字轉(zhuǎn)成數(shù)組,且數(shù)組的長度等于數(shù)字的大小

type Tuple<T extends number, U extends any[] = []> =
    U['length'] extends T ? U : Tuple<T, [...U, any]>
type res4 = Tuple<3> // [any, any, any]‘
// 基本上和上面的SmallerThan差不多,就是不夠長度,就push一個any進去

Subtract

顧名思義,獲取A-B的值

type Subtract<
    A extends number,
    B extends number
> = Tuple<A> extends [...Tuple<B>, ...infer R] ? R : never
type res3 = Subtract<10,8> // [any, any]
type Subtract<
    A extends number,
    B extends number
> = Tuple<A> extends [...Tuple<B>, ...infer R] ? R['length'] : never
type res3 = Subtract<20,10> // 10
// 一開始把A轉(zhuǎn)換長度為20的數(shù)組,B轉(zhuǎn)換成長度為10的數(shù)組,然后讓ts自己去infer,A的長度等于B的長度加上多少長度的數(shù)組,然后返回R的長度

最后

前面已經(jīng)實現(xiàn)了整除和減法,本著練習的態(tài)度,讓我們再實現(xiàn)一下乘法和加法。

加法

仿照前面的Subtract,不難實現(xiàn):

type Add<A extends number, B extends number > = [...Tuple<A>,...Tuple<B>] extends [... infer T] ? T['length']:never

乘法

接下來,讓我們實現(xiàn)一下乘法:

5*6 可以看作,5+5+5+5+5+5。

A*B,也就是A要累加自己B次。如果我們每進行一次加法,就讓被乘數(shù)B減一,直到被乘數(shù)B為0,也就完成了累加。

type Tuple<T extends number, U extends any[] = []> =
    U['length'] extends T ? U : Tuple<T, [...U, any]>
type Mutiply<A extends number, B extends number, S extends any[] = []> = B extends 0 ? S['length'] : Mutiply<A, Subtract<B, 1>, [...S, ...Tuple<A>]>
type res = Mutiply<5,6> //30

坑點

type Tuple<T extends number, S extends any[] = []> = S['length'] extends T ? S : Tuple<T, [...S, any]> // 不報錯
// type Tuple<T extends number, S extends any[] = []> = T extends S['length'] ? S : Tuple<T, [...S, any]> 
// 不能寫成T extends S['length'],ts會報遞歸可能是無限的

總結(jié)

我覺得還是套路為主,在研究了別人的除法實現(xiàn)后,也就能很容易實現(xiàn)加法和乘法。但如果沒有前面的研究,想破腦子也很難實現(xiàn)。

以上就是TypeScript類型實現(xiàn)加減乘除詳解的詳細內(nèi)容,更多關(guān)于TypeScript類型加減乘除的資料請關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • layui中的layer彈出層自定義樣式更改背景

    layui中的layer彈出層自定義樣式更改背景

    layui中的layer彈出層有很多提示框,但是我們使用最多的應該就幾種,layer.msg、layer.alert、layer.open、layer.load等。layer?有內(nèi)置的skin:layui-layer-lan,layui-layer-molv,可以直接使用。skin不僅允許你傳入layer內(nèi)置的樣式class名,可以自定義class名。
    2023-06-06
  • 數(shù)據(jù)結(jié)構(gòu)TypeScript之鄰接表實現(xiàn)示例詳解

    數(shù)據(jù)結(jié)構(gòu)TypeScript之鄰接表實現(xiàn)示例詳解

    這篇文章主要為大家介紹了數(shù)據(jù)結(jié)構(gòu)TypeScript之鄰接表實現(xiàn)示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-01-01
  • TS中Array.reduce提示沒有與此調(diào)用匹配的重載解析

    TS中Array.reduce提示沒有與此調(diào)用匹配的重載解析

    這篇文章主要為大家介紹了TS中Array.reduce提示沒有與此調(diào)用匹配的重載解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-06-06
  • JavaScript可視化圖表庫D3.js API中文參考

    JavaScript可視化圖表庫D3.js API中文參考

    這篇文章主要介紹了JavaScript可視化圖表庫D3.js API中文參考,本文對常用的API給出一中文翻譯,需要的朋友可以參考下
    2015-01-01
  • 淺談Sizzle的“編譯原理”

    淺談Sizzle的“編譯原理”

    正在學習Sizzle源碼或有一定前端基礎(chǔ)的同學們,可以一邊看源碼一邊看這些文章進行驗證,所以雖然我會分析源碼中的正則表達式,有大量的注釋,但不會講正則表達式的基本用法!
    2015-04-04
  • Xterm.js入門官方文檔示例詳解

    Xterm.js入門官方文檔示例詳解

    這篇文章主要為大家介紹了Xterm.js入門官方文檔示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2022-11-11
  • 自動生成typescript類型聲明工具實現(xiàn)詳解

    自動生成typescript類型聲明工具實現(xiàn)詳解

    這篇文章主要為大家介紹了自動生成typescript類型聲明工具實現(xiàn)示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-04-04
  • js庫Modernizr的介紹和使用

    js庫Modernizr的介紹和使用

    Modernizr是一個開源的JS庫,它使得那些基于訪客瀏覽器的不同(指對新標準支持性的差異)而開發(fā)不同級別體驗的設(shè)計師的工作變得更為簡單
    2015-05-05
  • 使用three.js 畫漸變的直線

    使用three.js 畫漸變的直線

    這篇文章主要介紹了使用three.js 畫漸變的直線的相關(guān)資料以及具體的實例代碼,有需要的小伙伴可以參考下
    2016-06-06
  • 初識SmartJS - AOP三劍客

    初識SmartJS - AOP三劍客

    隔了好久才終于又發(fā)布了一點東西,SmartJS是最近才開始搞的一個開源js庫,目的是做一些比較有特點的事情(smartjs暫時也是依賴于jquery)。
    2014-06-06

最新評論