Typescript 的类型工具
记录一些常用的类型工具是怎样使用的以及怎样实现的。
Partial
//作用: Partial<T>将T的所有属性变成可选的。
// 实现:
type Partial<T> = {
[P in keyof T]?: T[P];
}
Readonly
//作用: Readonly<T>将T的所有属性变成只读的。
// 实现:
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,key为联合类型中的每个子类型,类型为T
// 实现:
type Record<K extends keyof any, T> = {
[P in K]: T
}
// 示例:
interface A {
a: string,
b: number,
}
interface B {
key1: number,
key2: string,
}
type Eg2 = Record<keyof A, B>
/**
* @example
* type Eg2 = {a: B, b: B}
*/
Exclude
//作用:提取存在于T,但不存在于U的类型组成的联合类型
//实现:
type Exclude<T, U> = T extends U ? never : T;
// 示例:
type Eg = Exclude<'key1' | 'key2', 'key2'>
/**
* @example
* type Eg = 'key1'
*/
Extract
//作用:提取联合类型T和联合类型U的所有交集。
//实现:
type Extract<T, U> = T extends U ? T : never;
//示例:
type Eg = Extract<'key1' | 'key2', 'key1'>
/**
* @example
* type Eg = 'key1'
*/
Omit
//作用:从类型T中剔除K中的所有属性
//实现:
//方式一:
type Omit = Pick<T, Exclude<keyof T, K>>;
//方式二:
type Omit2<T, K extends keyof any> = {
[P in Exclude<keyof T, K>]: T[P]
}
//示例:
type M1 = {
name:string,
age:number
}
type M2 = {
name:string,
hab:boolean
}
type M3 = Omit<M1,keyof M2>
// type M3 = {
// age: number;
// }
Parameters
//作用:获取函数的参数类型,将每个参数类型放在一个元组中。
// 实现:
type Parameters<T extends (...args: any) => any> = T extends (...args: infer P) => any ? P : never;
// 示例:
type Eg = Parameters<(arg1: string, arg2: number) => void>;
/**
* @example
* type Eg = [arg1: string, arg2: number];
*/
ReturnType
//作用: 获取函数的返回值类型
// 实现:
type ReturnType<T extends (...args: any) => any> = T extends (...args: any) => infer R ? R : any;