记Typescript高级用法(二)

55 阅读1分钟

自言

你要做冲出的黑马而不是坠落的星星。

Exclude

排除指定值;

    type Exclude<T,E> =T extends E?never:T; 
    type A = Exclude<'a'|'b','a'> 
    // A ==> 'b'

Extract

保留值指定值,与Exclude相反

    type Extract<T,E> = T extends E?T:never;
    
    type A = Extract<'a'|'b','b'>
    // A ==> 'b'

NonNullable

排除null 和 undefined

    type NonNullable <T>=  T extends null|undefined?never:T;
    
    type A = 'a'|'b'|null|undefined;
    type B = NonNullable<A>
    // B ==> 'a'|'b'

Parameter

获取函数的形参,主要通过infer拿取

    type Parameter <T extends (...args)=>any> = T extends (...args:infer P)=>any?P:never;
    
    type A = Parameter<(a:number)=>void 0> 
    // A ==> [a:number]

ConstuctorParameters

获取constructor 的形参

    type ConstructorParameters <T extends new (...arg:any)=>any > = T extends new (...args:infer P)=>any?P:never;
    
    class A{
        constuctor(a:number){}
    }
    
    type AType = ConstructorParameters<typeof A>
    // AType ==> [a:number]

ReturnType

取函数返回值类型

    type ReturnType<T extends (...args:any)=>any> = T extends (...arg:any)=>infer R?never;
    
    type A = ReturnType<()=>({a:number})>
    // A ==> {a:number}

InstanceType

取实例的类型

    type InstanceType<T extends (...args:any)=>any> = T extends (...arg:any)=>infer R?never;
    
    type A = InstanceType<()=>({a:number})>
    // A ==> {a:number}

ThisParamterType

取this的类型

    type ThisParamterType <T extends (...args:any)=>any> = T extends (this:infer TH)=>any?TH:never;
    
    function A(this:{a:number}){}
    type AThis = ThisParamterType<typeof A>
    // AThis ==> {a:number}

OmitThisParamter

排除this 和参数

    type OmitThisParamter <T extends (this:any)=>any> = T extends (this:any)=>infer R?()=>R:never;