工具类型
1. 核心必会(占日常开发 80%)
这几个是你写业务逻辑时,几乎每天都要敲的“神技”。
| 工具类型 | 逻辑功能 | 场景举例 |
|---|---|---|
Partial<T> | 将所有属性变为可选 | 更新用户信息时(只传改动的部分属性) |
Required<T> | 将所有属性变为必填 | 确保配置对象经过初始化,所有项都存在 |
Readonly<T> | 将所有属性变为只读 | 防止配置项或常量对象在运行期间被修改 |
Pick<T, K> | 从 T 中精选出 K 属性 | 列表页只需要用户对象的id和name |
Omit<T, K> | 从 T 中剔除掉 K 属性 | 创建表单时,需要原对象除id以外的所有字段 |
Record<K, T> | 定义键值对映射 | 字典对象、配置表(如Record<string, Category>) |
2. 进阶必备(处理函数与异步)
当你开始封装公共组件、高阶函数或处理 API 请求时,这几个是避不开的。
| 工具类型 | 逻辑功能 | 场景举例 |
|---|---|---|
ReturnType<T> | 获取函数返回值的类型 | 自动获取一个复杂 API 请求函数返回的数据结构 |
Parameters<T> | 获取函数参数的类型 | 想要拦截某个函数,并原封不动地转发它的参数 |
Promise<T> | 表示异步操作的结果 | async函数的标准返回类型 |
Awaited<T> | 解包 Promise,获取最终结果 | 递归获取 Promise 里的resolve类型 |
3. 逻辑运算类(处理联合类型)
这类工具主要用于处理类似 type Status = 'success' | 'error' | 'loading' 这样的联合类型。
| 工具类型 | 逻辑功能 | 场景举例 |
|---|---|---|
Exclude<T, U> | 从 T 中排除掉可以赋值给 U 的类型 | 从状态中排除 'error' |
Extract<T, U> | 从 T 中提取出可以赋值给 U 的类型 | 从一堆混合类型中只要string |
NonNullable<T> | 排除掉null和undefined | 确保数据绝对安全,不会导致“空指针” |
4. 字符串模板类(TS 4.1+ 魔法)
这是比较现代的 TS 特性,用于处理字符串类型的格式。
Uppercase<S>: 转大写Lowercase<S>: 转小写Capitalize<S>: 首字母大写Uncapitalize<S>: 首字母小写
5. “避坑”建议
- 组合拳胜过单打独斗: 你可以嵌套使用。例如:
Readonly<Partial<User>>会得到一个“属性全可选且不可修改”的对象。 PickvsOmit的选择:- 如果属性很少,用
Pick(白名单思维,更安全)。 - 如果属性很多,只想扔掉一两个,用
Omit(黑名单思维)。 - 坑: 当原类型增加新属性时,
Omit会自动包含新属性,而Pick不会。在涉及敏感数据时,首选Pick。
- 如果属性很少,用
- 不要尝试记住全部: 大多数时候,你只需要记得“有一个工具可以把属性变可选”就行了。遇到需求时,回来查一下这张表。