记typescript高级用法(三)

92 阅读1分钟

自言

上天是公平的,有付出就有收获。

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