TypeScript 常用工具类型:Partial、Required、Pick、Omit、Record、Exclude、ReturnType
请说明 TypeScript 内置工具类型的作用和使用场景,并手写实现。
回答
孤独的心
1. Partial:将所有属性变为可选
type Partial<T> = { [P in keyof T]?: T[P] };
// 场景:更新部分字段
function updateUser(id: string, updates: Partial<User>) {}
2. Required:将所有属性变为必选
type Required<T> = { [P in keyof T]-?: T[P] };
3. Pick<T, K>:从 T 中选取部分属性
type Pick<T, K extends keyof T> = { [P in K]: T[P] };
// Pick<User, 'id' | 'name'> → { id: string; name: string }
4. Omit<T, K>:从 T 中排除部分属性
type Omit<T, K extends keyof any> = Pick<T, Exclude<keyof T, K>>;
// Omit<User, 'password'> → 不包含 password
5. Record<K, V>:构建键值对对象类型
type Record<K extends keyof any, V> = { [P in K]: V };
// Record<'GET' | 'POST', string> → { GET: string; POST: string }
6. Exclude<T, U>:从联合类型中排除
type Exclude<T, U> = T extends U ? never : T;
// Exclude<'a' | 'b' | 'c', 'a' | 'b'> → 'c'
7. ReturnType:提取函数返回值类型
type ReturnType<T extends (...args: any) => any> = T extends (...args: any) => infer R ? R : never;
// ReturnType<typeof fetch> → Promise<Response>
其他工具类型:
Parameters<T>— 提取函数参数类型元组NonNullable<T>— 排除 null 和 undefinedExtract<T, U>— 从联合中提取Readonly<T>— 所有属性只读InstanceType<T>— 构造函数实例类型