ts的内置工具类型
什么是 TypeScript 的工具类型?
TypeScript 提供了一些 内置的、通用的类型工具,它们本质上是 基于泛型的高级类型操作,用来帮助开发者:
更灵活地操作已有类型
提取、组合、约束、转换对象的属性类型
减少重复代码,提高类型安全与开发效率
这些工具类型 并不是函数(不是运行时函数,而是类型层面的工具),但习惯上我们称它们为 “工具类型” 或 “工具函数”,因为它们的使用方式类似函数调用,比如:
type PartialUser = Partial<User>;
✅ 二、TypeScript 常用内置工具类型一览表
下面是 TypeScript 内置的、最常用的工具类型,以及它们的作用和示例 👇
工具类型 | 作用 | 示例 |
---|---|---|
| 将类型 |
|
| 将类型 |
|
| 将类型 |
|
| 从类型 |
|
| 从类型 |
|
| 构造一个类型,其键为类型 |
|
| 从联合类型 |
|
| 从联合类型 |
|
| 从类型 |
|
| 获取函数类型 | 用于提取函数参数类型 |
| 获取函数类型 | 用于提取函数返回值类型 |
| 获取构造函数类型的所有参数类型(比如 class 的构造参数) | |
| 获取构造函数类型 |
✅ 三、最常用的几个工具类型详解 + 示例
1. Partial<T>
—— 所有属性变为可选
interface User {id: number;name: string;age: number;
}type PartialUser = Partial<User>;
// 等价于:
// {
// id?: number;
// name?: string;
// age?: number;
// }
✅ 用途: 比如表单编辑时,你可能只更新部分字段,而不是全部
2. Required<T>
—— 所有属性变为必填
type RequiredUser = Required<PartialUser>;
// 所有原来可选的属性,现在都变成必填了
✅ 用途: 强制要求某些数据完整,比如提交时
3. Readonly<T>
—— 所有属性只读
type ReadonlyUser = Readonly<User>;
// 所有属性都变成 readonly,不可修改
// 比如用于配置对象、常量对象等
4. Pick<T, K>
—— 挑选某些属性
type NameOnly = Pick<User, 'name'>;
// { name: string }
✅ 用途: 比如你只关心用户的 name 字段,其它都不要
5. Omit<T, K>
—— 排除某些属性
type UserWithoutId = Omit<User, 'id'>;
// { name: string; age: number }
✅ 用途: 比如提交数据时不传 id(由后端生成)
6. Record<K, V>
—— 构建键值映射类型
type UserMap = Record<number, User>;
// 等价于:{ [key: number]: User }
✅ 用途: 比如你有一个以 ID 为 key 的用户字典/缓存
7. Exclude<T, U>
和 Extract<T, U>
—— 联合类型操作
type T = string | number;
type OnlyString = Extract<T, string>; // string
type NotString = Exclude<T, string>; // number
✅ 用途: 比如过滤出某种特定类型,常用于处理联合类型
8. NonNullable<T>
—— 去掉 null 和 undefined
type T = string | null | undefined;
type ValidString = NonNullable<T>; // string
✅ 用途: 比如你确定某个值不应该为 null/undefined,做类型收窄
9. Parameters<T>
和 ReturnType<T>
—— 函数类型工具
function greet(name: string): string {return `Hello, ${name}`;
}type GreetParams = Parameters<typeof greet>; // [name: string]
type GreetReturn = ReturnType<typeof greet>; // string
✅ 用途: 提取函数参数类型和返回值类型,常用于高阶函数、Hooks、封装等
✅ 四、在哪里用到了这些工具类型?(实际应用场景)
工具类型 | 常见使用场景 |
---|---|
| 表单数据、更新操作(只传部分字段) |
| 提交数据校验,确保必填字段都有值 |
| 配置对象、常量对象,防止被修改 |
| 只选择对象中的部分字段,比如 API 返回的数据只用一部分 |
| 去掉敏感字段或不需要传的字段,比如去掉 |
| 构建字典、映射表,比如 |
| 类型过滤,比如从联合类型中排除某些类型 |
| 类型筛选,比如只提取某种类型 |
| 过滤掉可能为 null/undefined 的值,提高类型安全 |
| 提取函数参数和返回值类型,用于高阶函数、自定义 Hook、wrapper 函数等 |
如何结合 泛型 + 工具类型 做更强大的类型推导
案例 1:通用 API 请求 Hook(结合泛型 + ReturnType / Parameters)
场景:
你有一堆 API 请求函数,比如:
function fetchUser(id: number): Promise<{ name: string; age: number }> { return axios.get(`/user/${id}`).then(res => res.data); }
你希望写一个通用的
useApi
Hook,它能:接受一个异步函数
自动推导出它的 参数类型 和 返回值类型
提供 loading、error、data 状态
如何在 React + TypeScript 项目中广泛使用这些工具类型(比如自定义 Hook、高阶组件、表单、API 层)