自言
上天是公平的,有付出就有收获。
FirstChar
type FirstChar<T extends string> = T extends `${infer L}${infer R}`?L:never;
//用法:
type a= FirstChar<'abc'>
// a ===> 'a'
LastChar
type LastChar<T extends string> = T extends `${infer L}${infer R}`?
R extends ''?L:LastChar<R>:never;
type a =LastChar<'abc'>
//a ===> 'c'
TupleToUnion
type TupleToUnion<T extends any[],Result=T[0]> = T extends [infer L,...infer R]?
TupleToUnion<R,Result|L>:Result;
type a = TupleToUnion<[string,number,boolean]>
// a ===> string|number|boolean
FirstItem
type FirstItem<T extends any[] > = T extends [infer L,...infer R]?L :never;
type a = FirstItem <[string,number]>
// a ===> string
LastItem
type LastItem <T extends anything []>= T extends [...infer L,infer R]?R:never;
type a = FirstItem <[string,number]>
// a ===> number
IsNever
type IsNever<T> = [T] extends [never]?true:false;
type a = IsNever<string>
// false
StringToTuple
type StringToTuple <T extends string> =
T extends `${infer L}${infer R}`?[L,...StringToTuple<R>]:[]
type a = StringToTuple<'abc'>
//a ===> ['a','b','c']
LengthOfTuple
type LengthOfTuple<T extends any[]> = T['length']
type a = LengthOfTuple<[1,2,3]>
// a ===> 3
LengthOfString
type LengthOfString <T extends string> = StringToTuple<T> ['length'];
type a = LengthOfString<'abc'>
// a ==>3