TS高级类型内置工具类型

Partial<T>

将泛型 T 中的所有属性转化为可选属性

/**
 * Make all properties in T optional
 */
type Partial<T> = {
    [P in keyof T]?: T[P];
};


interface IUser {
  name: string;
  age: number;
}


type t = Partial<IUser>;
/* type t = {
    name?: string;
    age?: number
} */

Required<T>

将泛型 T 中的所有属性转化为必选属性

/**
 * Make all properties in T required
 */
type Required<T> = {
    [P in keyof T]-?: T[P];
};


interface IUser {
  name?: string;
  age?: number;
}


type t = Required<IUser>;
/* type t = {
    name: string;
    age: number
} */

Readonly<T>

将泛型 T 中的所有属性转化为只读属性

/**
 * Make all properties in T readonly
 */
type Readonly<T> = {
    readonly [P in keyof T]: T[P];
};


interface IUser {
  name: string;
  age: number;
}


type t = Readonly<IUser>;
/* type t = {
    readonly name: string;
    readonly age: number
} */

Pick<T, K extends keyof T>

从泛型 T 中检出指定的属性并组成一个新的对象类型

/**
 * From T, pick a set of properties whose keys are in the union K
 */
type Pick<T, K extends keyof T> = {
    [P in K]: T[P];
};


interface IUser {
  name: string;
  age: number;
  address: string;
}


type t = Pick<IUser, 'name' | 'age'>;
/* type t = {
    name: string;
    age: number
} */

Record<K extends keyof any, T>

Record 允许从 Union 类型中创建新类型,Union 类型中的值用作新类型的属性。

经常用于接口 response 类型声明

/**
 * Construct a type with a set of properties K of type T
 */
type Record<K extends keyof any, T> = {
    [P in K]: T;
};


type Car = 'Audi' | 'BMW' | 'MercedesBenz'
type CarList = Record<Car, {age: number}>


const cars: CarList = {
    Audi: { age: 119 },
    BMW: { age: 113 },
    MercedesBenz: { age: 133 },
}

Exclude<T, U>

从泛型 T 中排除可以赋值给泛型 U 的类型

/**
 * Exclude from T those types that are assignable to U
 */
type Exclude<T, U> = T extends U ? never : T;


type a = 1 | 2 | 3;


type t = Exclude<a, 1 | 2>;
/* type t = 3 */

Extract<T, U>

从泛型 T 中提取可以赋值给泛型 U 的类型

/**
 * Extract from T those types that are assignable to U
 */
type Extract<T, U> = T extends U ? T : never;


type a = 1 | 2 | 3;


type t = Extract<a, 1 | 2>;
/* type t = 1 | 2 */

Omit<T, K extends keyof any>

从泛型 T 中提取出不在泛型 K 中的属性类型,并组成一个新的对象类型

/**
 * Construct a type with the properties of T except for those in type K.
 */
type Omit<T, K extends keyof any> = Pick<T, Exclude<keyof T, K>>;


interface IUser {
  name: string;
  age: number;
  address: string;
}


type t = Omit<IUser, 'name' | 'age'>;
/* type t = {
    address: string;
} */

NonNullable<T>

从泛型 T 中排除掉 null 和 undefined

/**
 * Exclude null and undefined from T
 */
type NonNullable<T> = T extends null | undefined ? never : T;


type t = NonNullable<'name' | undefined | null>;
/* type t = 'name' */

Parameters<T extends (...args: any) => any>

以元组的方式获得函数的入参类型

/**
 * Obtain the parameters of a function type in a tuple
 */
type Parameters<T extends (...args: any) => any> = T extends (...args: infer P) => any ? P : never;


type t = Parameters<(name: string) => any>; // type t = [string]
type t2 = Parameters<((name: string) => any)  | ((age: number) => any)>; // type t2 = [string] | [number]

ConstructorParameters<T extends new (...args: any) => any>

以元组的方式获得构造函数的入参类型

/**
 * Obtain the parameters of a constructor function type in a tuple
 */
type ConstructorParameters<T extends new (...args: any) => any> = T extends new (...args: infer P) => any ? P : never;


type t = ConstructorParameters<(new (name: string) => any)  | (new (age: number) => any)>;
// type t = [string] | [number]

ReturnType<T extends (...args: any) => any>

获得函数返回值的类型

/**
 * Obtain the return type of a function type
 */
type ReturnType<T extends (...args: any) => any> = T extends (...args: any) => infer R ? R : any;


type t = ReturnType<(name: string) => string | number>
// type t = string | number

InstanceType<T extends new (...args: any) => any>

获得构造函数返回值的类型

/**
 * Obtain the return type of a constructor function type
 */
type InstanceType<T extends new (...args: any) => any> = T extends new (...args: any) => infer R ? R : any;


type t = InstanceType<new (name: string) => {name: string, age: number}>
/* 
type h = {
    name: string;
    age: number;
}
*/

总结:

1、重点理解这些内置的工具类型的定义。

2、能够以此为参考写一些工具类型并运用到项目中去。

  • 0
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值