内置高级类型

Parameters

用来提取函数参数的类型

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

ReturnType

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

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

ConstructorParameters

用来提取构造器的参数类型

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

InstanceType

用来提取构造器的返回值类型

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

Partial

用来把索引类型变成可选类型

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

Required

用来将可选索引类型变成必选类型,也就是Required类型

type Required<T> = {
    [P in keyof T]-?: T[P];
};

Readonly

用来将索引类型变成只读类型

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

Pick

用来对索引进行修改和过滤

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

Record

用来创建索引类型

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

Exclude

用来删除联合类型的一部分

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

Extract

用来保留联合类型的一部分

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

Omit

用来保留索引,也就是和Pick反过来

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

Awaited

用来获取Promise的ValueType的类型

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

NonNullable

用来判断是否为非空类型

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

ThisParameterType

用来约束this

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

OmitThisParameter

用来提取this

type OmitThisParameter<T> = 
    unknown extends ThisParameterType<T> 
        ? T 
        : T extends (...args: infer A) => infer R 
            ? (...args: A) => R 
            : T;