Skip to content

Parameters

用于提取函数类型的参数类型,返回元组类型

例子:

typescript
type ParametersRes = Parameters<(name: string, age: number)=>{}>

// type ParametersRes = [name: string, age: number]

实现:

typescript
type Parameters<T extends (...args: any) => any> = 
    T extends (...args: infer P) => any
        ? P
        : never;

ReturnType

提取函数类型的返回值类型

例子:

typescript
type ReturnTypeRes = ReturnType<() => 'dong'>

// type ReturnTypeRes = 'dong'

实现:

typescript
type ReturnType<T extends (...args: any) => any> = 
    T extends (...args: any) => infer R
        ? R
        : never;

ConstructorParameters

提取构造器参数类型

例子:

typescript
interface PersonConstructor {
    new (name: string): Person;
}

type ConstructorParametersRes = ConstructorParameters<PersonConstructor>
// type ConstructorParametersRes = [name: string]

实现:

typescript

type ConstructorParameters<T extends abstract new (...args: any) => any> = 
    T extends abstract new (...args: infer P) => any 
        ? P
        : never;

InstanceType

提取构造器返回值类型

例子:

typescript
interface PersonConstructor {
    new (name: string): Person;
}

type InstanceTypeRes = InstanceType<PersonConstructor>;

// type InstanceTypeRes = Person

实现:

typescript

type InstanceType<T extends abstract new (...args: any) => any> = 
    T extends abstract new (...args: any) => infer R 
        ? R
        : never;

ThisParameterType

返回函数中this参数的类型

例子:

typescript

type Person = {
    name: 'zack'
}

function hello(this: Person) {
    console.log(this.name)
}

type ThisParameterTypeRes = ThisParameterType<typeof hello>

// type ThisParameterTypeRes = {name: 'zack'}

实现:

typescript
type ThisParameterType<T> =
    T extends (this: infer U, ...args: any[]) => any
        ? U
        : unknown;

OmitThisParameter

返回函数类型,忽略参数this

例子:

typescript
function say(this: Person, age: number) {
    console.log(this.name)
    return this.name + ' ' + this.age
}

type OmitThisParameterRes = OmitThisParameter<typeof say>

// type OmitThisParameterRes = (age: number) => string

实现:

typescript

Partial

把索引变为可选

例子:

typescript
type PartialRes = Partial<{name:'zack', age: 20}>

/**

type PartialRes = {
    name?: 'zack' | undefined,
    aeg?: 20 | undefined
}

**/

实现:

typescript
type Partial<T> = {
    [P in keyof T]?: T[P]
}

Required

去掉索引可选

例子:

typescript

type RequiredRes = Required<{name?: 'zack', age?: 20}>

/**
type RequiredRes = {
    name: 'zack'
    age: 18
}
**/

实现:

typescript
type Readonly<T> = {
    readonly [P in keyof T]: T[P]
}

Readonly (略)

Pick

过滤用于构造新的索引类型

例子:

typescript

type PickRes = Pick<{name: 'zack', age: 20, sex: 1}, 'name' | 'age'>

/**
type PickRes = {
    name: 'zack';
    age: 20;
}
**/

实现:

typescript

type Pick<T, K extends keyof T> = {
    [P in K]: T[P]
}

Record

创建索引类型

例子:

typescript

type RecordRes = Record<'a' | 'b', number>

/**
type RecordRes = {
   a: number;
   b: number;
}
**/

实现:

typescript
type Record<K extends keyof any, T> = {
    [P in K]: T
}

// keyof any的结果是:string | number | symbol

Exclude

从联合类型中去除一部分类型

例子:

typescript
type ExcludeRes = Exclude<'a'|'b'|'c'|'d', 'a'|'b'>

// type ExcludeRes = 'c' | 'd'

实现:

typescript
type Exclude<T, U> = T extends U ? never : T;

Extract

联合类型取交集

例子:

typescript
type ExtractRes = Extract<'a'|'b'|'c'|'d','a'|'b'>

// type ExtractRes = 'a' | 'b'

实现:

typescript

type Extract<T, U> = T extends U ? T : never;

Omit

去掉某些索引,构造新的索引类型

例子:

typescript
type OmitRes = Omit<{name: 'zack', age: 20}, 'name'>

// type OmitRes = {age: 20}

实现:

typescript

type Omit<T, K extends keyof any> = Pick<T, Exclude<keyof T, K>>;

Awaited

例子:

typescript
type AwaitedRes = Awaited<Promise<Promise<Promise<number>>>>
// type AwaitedRes = number

实现:

typescript

type Awaited<T> = 
    T extends null | undefined 
        ? T
        : T extends object & { then(onfulfiled: infer F): any }
            ? F extends ((value: infer V, ...args: any) => any)
                ? Awaited<V>
                : never
            : T

NonNullable

用于判断是否是非空(null、undefined)类型,如果是空类型,返回never,否则返回本身

例子:

typescript
type NonNullableRes1 = NonNullable<null>

// type NonNullableRes1 = never

type NonNullableRes2 = NonNullable<{name: 'zack'}>

// type NonNullableRes2 = {name: 'zack'}

实现:

typescript
type NonNullable<T> = T extends null | undefined ? never : T