體操就是做鍛煉,給你的大腦做鍛煉
有沒有什么實(shí)際的意義呢?我覺得沒有,工作中用不到尿贫,只是為了鍛煉而已
if else
JS:
if (A <= B) {
return true
} else {
return false
}
TS:
type A = 1
type B = 1 | 2
type Result = A extends B ? true : false
加一點(diǎn)復(fù)雜
JS:
if (A<= B && C<= D) {
...
} else {
...
}
TS:
type A = 1
type B = 1 | 2
type C = 3
type D = 3 | 4
type Result = A extends B
? C extends D
? 'true, true'
: 'true, false'
: C extends D
? 'false, true'
: 'false, false'
看的出來,沒有 if else踏揣,TS 的代碼很難看
這就是 TS 類型體操的蛋疼之處庆亡,并不是邏輯復(fù)雜,而是看起來復(fù)雜
判斷是否是元組
type A = []
type IsEmptyArray<T exxtends unknown[]> = Arr['length'] extends 0 ? true : false
type Result = IsEmptyArray<A> // TODO: true
infer
還是以上面判斷是否為元組的栗子:
type A = []
type IsEmptyArray<T exxtends unknown[]> = Arr extends [...inter X[], inter D] ? true : false
type Result = IsEmptyArray<A> // TODO: true
這里用 inter “引用”(可以把它當(dāng)做 var)捞稿,等價(jià)于:
type A = []
type IsEmptyArray<T exxtends unknown[]> = Arr extends [...unknown[], unknown] ? true : false
type Result = IsEmptyArray<A> // TODO: true
遞歸
等價(jià)于 for 循環(huán)又谋,但是在 TS 中遞歸有層數(shù)限制(不多),有興趣動(dòng)手可以測(cè)試一下
type A = ['ji', 'ni', 'tai', 'mei']
type Reverse<Arr extends unknown[]> =
Arr extends [...infer Rest, inter Last]
? [Last, ...Reverse<Rest>]
: Arr
tytpe Result = Reverse<A> // TODO: ['mei', 'tai', 'ni', 'ji']
模式匹配
合并元組
type A = [1, 2]
type B = [3, string]
type C = [...A, ...B]
獲取元組的最后一項(xiàng)
type Arr = [1, 2, 3, 4]
type Last<T extends unknown[]> = T extends [...Rest, Last] ? Last : never
type L = Last<Arr>
模版字符串
type A = 'A'
type B = 'B'
type C = 'C'
type X = `${A} ${B} ${C}` // TODO: 'A B C'
沒錯(cuò)娱局,模版字符串在 TS 中也能使用
怎么獲取字符串的第一個(gè)彰亥?沒錯(cuò)還是用模式匹配
type A = 'ji ni tai mei'
type First<T extends string> = T extends `${inter First}${string}` ? F : never
type Result = First<A> // TODO: j
那怎么獲取字符串的最后一項(xiàng)呢?似乎有點(diǎn)麻煩衰齐,也許可能用遞歸能實(shí)現(xiàn)
但是這個(gè)時(shí)候就需要換一種思路了任斋,獲取元組的最后一項(xiàng)非常簡(jiǎn)單,那么直到能把字符串轉(zhuǎn)換成元組就好了(體操最重要的就是思路3芴巍)
type A = 'ji ni tai mei'
type LastOfArr<T extends unknown[]> = T extends [...inter _, inter Last] ? Last : never
type StringToArr<T extends string> = T extends `${inter F}${inter Rest}` ? [F, ...StringToArr<Rest>] : []
type LastOfString = LastOfArr<StringToArr<A>>
相應(yīng)的也能轉(zhuǎn)換成聯(lián)合類型
type A = 'ji ni tai mei'
type StringToUnion<T extends string> = T extends `${inter F}${inter Rest}` ? F | StringToUnion<Rest> : never
type Result = StringToUnion<A> // TODO: 'j' | 'i' | 'n' | 't' | 'a' | 'm' | 'e'
// TODO: 注意废酷,聯(lián)合類型自動(dòng)去重了