自言
你要做冲出的黑马而不是坠落的星星。
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;