差别
这里会显示出您选择的修订版和当前版本之间的差别。
| typescript:第十四章_类型操作符 [2026/03/09 15:26] – 创建 张叶安 | typescript:第十四章_类型操作符 [2026/04/27 20:11] (当前版本) – 张叶安 | ||
|---|---|---|---|
| 行 11: | 行 11: | ||
| keyof 操作符用于获取类型的所有键组成的联合类型。 | keyof 操作符用于获取类型的所有键组成的联合类型。 | ||
| - | < | + | < |
| interface Person { | interface Person { | ||
| name: string; | name: string; | ||
| 行 39: | 行 39: | ||
| ==== 14.1.2 keyof 与索引签名 ==== | ==== 14.1.2 keyof 与索引签名 ==== | ||
| - | < | + | < |
| // 字符串索引签名 | // 字符串索引签名 | ||
| interface StringDictionary { | interface StringDictionary { | ||
| 行 65: | 行 65: | ||
| ==== 14.1.3 实战应用:pick 函数 ==== | ==== 14.1.3 实战应用:pick 函数 ==== | ||
| - | < | + | < |
| // 实现类型安全的对象选择 | // 实现类型安全的对象选择 | ||
| function pick<T, K extends keyof T>(obj: T, keys: K[]): Pick<T, K> { | function pick<T, K extends keyof T>(obj: T, keys: K[]): Pick<T, K> { | ||
| 行 102: | 行 102: | ||
| 在类型上下文中,typeof 用于获取变量或表达式的类型。 | 在类型上下文中,typeof 用于获取变量或表达式的类型。 | ||
| - | < | + | < |
| // 获取对象类型 | // 获取对象类型 | ||
| const person = { | const person = { | ||
| 行 136: | 行 136: | ||
| ==== 14.2.2 typeof 与 const 断言结合 ==== | ==== 14.2.2 typeof 与 const 断言结合 ==== | ||
| - | < | + | < |
| // 使用 const 断言获得更精确的类型 | // 使用 const 断言获得更精确的类型 | ||
| const config = { | const config = { | ||
| 行 168: | 行 168: | ||
| ==== 14.2.3 实战:从运行时对象创建类型 ==== | ==== 14.2.3 实战:从运行时对象创建类型 ==== | ||
| - | < | + | < |
| // 运行时配置对象 | // 运行时配置对象 | ||
| const API_ENDPOINTS = { | const API_ENDPOINTS = { | ||
| 行 204: | 行 204: | ||
| in 操作符用于遍历联合类型的每个成员,常用于创建映射类型。 | in 操作符用于遍历联合类型的每个成员,常用于创建映射类型。 | ||
| - | < | + | < |
| // 基础映射类型 - 将所有属性变为只读 | // 基础映射类型 - 将所有属性变为只读 | ||
| type Readonly< | type Readonly< | ||
| 行 236: | 行 236: | ||
| ==== 14.3.2 重映射键名(TypeScript 4.1+)===== | ==== 14.3.2 重映射键名(TypeScript 4.1+)===== | ||
| - | < | + | < |
| // 使用 as 重映射键名 | // 使用 as 重映射键名 | ||
| type Getters< | type Getters< | ||
| 行 271: | 行 271: | ||
| ==== 14.3.3 实战:创建事件处理器类型 ==== | ==== 14.3.3 实战:创建事件处理器类型 ==== | ||
| - | < | + | < |
| // 根据属性创建对应的事件处理器类型 | // 根据属性创建对应的事件处理器类型 | ||
| type EventHandlers< | type EventHandlers< | ||
| 行 327: | 行 327: | ||
| is 关键字用于创建返回 boolean 的自定义类型保护函数。 | is 关键字用于创建返回 boolean 的自定义类型保护函数。 | ||
| - | < | + | < |
| // 基本类型保护 | // 基本类型保护 | ||
| function isString(value: | function isString(value: | ||
| 行 350: | 行 350: | ||
| ==== 14.4.2 复杂类型保护 ==== | ==== 14.4.2 复杂类型保护 ==== | ||
| - | < | + | < |
| // 接口定义 | // 接口定义 | ||
| interface Cat { | interface Cat { | ||
| 行 399: | 行 399: | ||
| ==== 14.4.3 泛型类型保护 ==== | ==== 14.4.3 泛型类型保护 ==== | ||
| - | < | + | < |
| // 检查对象是否有某个属性 | // 检查对象是否有某个属性 | ||
| function hasProperty< | function hasProperty< | ||
| 行 433: | 行 433: | ||
| 条件类型根据类型关系选择两种类型之一,语法类似三元运算符。 | 条件类型根据类型关系选择两种类型之一,语法类似三元运算符。 | ||
| - | < | + | < |
| // 基本语法: | // 基本语法: | ||
| type IsString< | type IsString< | ||
| 行 464: | 行 464: | ||
| 当条件类型作用于泛型参数时,会自动分布到联合类型的每个成员。 | 当条件类型作用于泛型参数时,会自动分布到联合类型的每个成员。 | ||
| - | < | + | < |
| // 分布式条件类型 | // 分布式条件类型 | ||
| type ToArray< | type ToArray< | ||
| 行 488: | 行 488: | ||
| infer 用于在条件类型中推断类型变量。 | infer 用于在条件类型中推断类型变量。 | ||
| - | < | + | < |
| // 提取函数返回类型 | // 提取函数返回类型 | ||
| type ReturnType< | type ReturnType< | ||
| 行 523: | 行 523: | ||
| ==== 14.6.1 基础映射类型 ==== | ==== 14.6.1 基础映射类型 ==== | ||
| - | < | + | < |
| // 只读类型 | // 只读类型 | ||
| type Readonly< | type Readonly< | ||
| 行 563: | 行 563: | ||
| ==== 14.6.2 深度映射类型 ==== | ==== 14.6.2 深度映射类型 ==== | ||
| - | < | + | < |
| // 深度只读 | // 深度只读 | ||
| type DeepReadonly< | type DeepReadonly< | ||
| 行 609: | 行 609: | ||
| ==== 14.7.1 基础模板字面量 ==== | ==== 14.7.1 基础模板字面量 ==== | ||
| - | < | + | < |
| // 字符串字面量拼接 | // 字符串字面量拼接 | ||
| type EventName< | type EventName< | ||
| 行 629: | 行 629: | ||
| ==== 14.7.2 模板字面量的模式匹配 ==== | ==== 14.7.2 模板字面量的模式匹配 ==== | ||
| - | < | + | < |
| // 提取事件名 | // 提取事件名 | ||
| type GetEvent< | type GetEvent< | ||
| 行 659: | 行 659: | ||
| ==== 14.8.1 组合多个操作符 ==== | ==== 14.8.1 组合多个操作符 ==== | ||
| - | < | + | < |
| // 提取对象的可选属性名 | // 提取对象的可选属性名 | ||
| type OptionalKeys< | type OptionalKeys< | ||
| 行 686: | 行 686: | ||
| ==== 14.8.2 递归类型操作 ==== | ==== 14.8.2 递归类型操作 ==== | ||
| - | < | + | < |
| // 路径字符串生成 | // 路径字符串生成 | ||
| type Path<T, K extends keyof T = keyof T> = | type Path<T, K extends keyof T = keyof T> = | ||
| 行 738: | 行 738: | ||
| 实现一个函数,能够安全地获取对象的多个属性: | 实现一个函数,能够安全地获取对象的多个属性: | ||
| - | < | + | < |
| function pluck<T, K extends keyof T>(obj: T, keys: K[]): Pick<T, K> { | function pluck<T, K extends keyof T>(obj: T, keys: K[]): Pick<T, K> { | ||
| // 实现 | // 实现 | ||
| 行 764: | 行 764: | ||
| 参考答案 | 参考答案 | ||
| - | < | + | < |
| function pluck<T, K extends keyof T>(obj: T, keys: K[]): Pick<T, K> { | function pluck<T, K extends keyof T>(obj: T, keys: K[]): Pick<T, K> { | ||
| const result = {} as Pick<T, K>; | const result = {} as Pick<T, K>; | ||
| 行 862: | 行 862: | ||
| 实现以下类型工具: | 实现以下类型工具: | ||
| - | < | + | < |
| // 1. 提取数组的嵌套层级深度 | // 1. 提取数组的嵌套层级深度 | ||
| type ArrayDepth< | type ArrayDepth< | ||
| 行 875: | 行 875: | ||
| 参考答案 | 参考答案 | ||
| - | < | + | < |
| // 1. 数组嵌套深度 | // 1. 数组嵌套深度 | ||
| type ArrayDepth< | type ArrayDepth< | ||
| 行 911: | 行 911: | ||
| 实现一个类型安全的表单验证系统: | 实现一个类型安全的表单验证系统: | ||
| - | < | + | < |
| // 要求: | // 要求: | ||
| // 1. 根据数据模型自动生成验证规则类型 | // 1. 根据数据模型自动生成验证规则类型 | ||
| 行 920: | 行 920: | ||
| 参考答案 | 参考答案 | ||
| - | < | + | < |
| // 验证规则类型 | // 验证规则类型 | ||
| interface ValidationRule< | interface ValidationRule< | ||