type A = ['ji','ni','tai','mei']
type Reverse<Arr extends unknown[]> =
Arr extends [...infer Rest,infer Last] ? [Last, ...Reverse<Rest>] : Arr
type Result = Reverse<A> // ['mei','tai','ni','ji']
-
infer
可以理解為引用
,也可以理解為聲明變量
戴质,通常出現(xiàn)在條件類(lèi)型
虑稼,與 extends
一起使用
- 實(shí)踐:
- 元祖體操:
模式匹配
和infer
// 元祖擴(kuò)展
type A = [1]
type B = [...A,2]
// 取元祖的最后一個(gè)元素魂奥,這種方式也叫 模式匹配
type A = ['ji','ni','tai','mei']
type Last<T extends unknown[]> = T extends [...infer _ , infer L] ? L : never
type Result = Last<A> // 'mei'
- 字符串體操
// 內(nèi)置 Capitalize;Uppercase;Lowercase;Uncapitalize
// 模版字符串類(lèi)型
type S = 'ji'
type R = `${S}` // 'ji'
// 取第一個(gè)字符讨跟,模式匹配
type S = "ji ni tai mei"
type First<T extends string> = T extends `${infer F} ${string}` ? F : never
type Result = First<S>
// 取最后一個(gè)單詞
type S = "ji ni tai mei"
type LastWord<T extends string> = T extends `${infer F} ${infer L}` ? LastWord<L> : T
type Result = LastWord<S> // 'mei'
// 取最后一個(gè)字符
type S = "ji ni tai mei !"
type LastOfTuple<T extends unknown[]> = T extends [...infer Rest, infer F] ? F : never
type StringToTuple<T extends string> =
T extends `${infer F}${infer Rest}` ? [F, ...StringToTuple<Rest>] : []
type LastOfString = LastOfTuple<StringToTuple<S>> // '!'
// string 轉(zhuǎn) 聯(lián)合類(lèi)型
type StringToUnion<T extends string> =
T extends `${infer F}${infer R}` ? F | StringToUnion<R> : never
type C = StringToUnion<'abc'> // 'a' | 'b' | 'c'
- 函數(shù)常用工具類(lèi)型:
ReturnType
纪他、Parameters(返回一個(gè)元祖類(lèi)型,因?yàn)閰?shù)是數(shù)組)
const fn = (a:number,b:number) => 'a + b'
const fn1 = ({name,age}: {name: string, age: number}) => {}
type F = typeof fn // (a:number, b:number) => string
type R = ReturnType<F> // string
type MyReturnType<T extends (...args:any)=>any> = T extends (...args:any)=> infer R ? R : any
type P = Parameters<F> // [a:number,b:number]
type P2 = Parameters<typeof fn1> // [{name:string, age:number}]