考察点分析

本题主要考察以下三个核心能力维度:

  1. TypeScript类型系统理解:映射类型(Mapped Types)的实现需要对TS类型操作、索引签名等有清晰认知
  2. 工具类型原理掌握:要求候选人能拆解内置工具类型的工作机制,理解类型修饰符操作
  3. 类型编程思维:考核是否能通过类型参数化、键遍历等特性进行类型转换

具体技术评估点:

  • keyof操作符与索引类型查询
  • 映射类型语法结构
  • 属性修饰符(readonly/ional)的增删机制
  • 内置工具类型的实现差异

技术解析

关键知识点

  1. keyof类型运算符:提取对象类型属性名的联合类型
  2. 映射类型语法[K in Keys]形式的索引签名
  3. 属性修饰符操作:通过+/-控制readonly/ional修饰符
  4. 类型遍历机制:对联合类型的分布式处理特性

原理剖析

映射类型通过keyof获取源类型属性名集合,使用in关键字进行遍历。基本结构:

  type MappedType<T> = {
  [K in keyof T]: NewType
}
  
  • keyof T返回T的属性名联合类型(如’name’|‘age’)
  • K in逐个取出联合类型成员进行遍历
  • 通过T[K]获取原始属性类型,可替换为任意类型

内置工具类型实现差异:

  // 添加可选修饰符
type Partial<T> = {
  [K in keyof T]?: T[K]
}

// 添加只读修饰符
type Readonly<T> = {
  readonly [K in keyof T]: T[K]
}

// 移除可选修饰符
type Required<T> = {
  [K in keyof T]-?: T[K]
}
  

常见误区

  1. 混淆keyofObject.keys:前者是类型运算,后者是值空间操作
  2. 遗漏修饰符操作:内置类型通过+/-显式控制修饰符状态
  3. 错误理解映射范围:未正确处理符号属性(如[Symbol.iterator]

问题解答

通过映射类型{ [P in keyof T]: boolean }可将对象属性全部转为布尔值:

  type Booleanify<T> = {
  [K in keyof T]: boolean
}
  
  • keyof T获取T的所有属性名
  • 每次迭代将对应属性类型设为boolean

内置类型实现逻辑:

  • Partial:添加?修饰符使属性可选
  • Readonly:添加readonly修饰符使属性只读
  • 通过+/-前缀可显式添加/移除修饰符

深度追问

  1. 如何实现递归的深层次Readonly? 提示:结合条件类型递归遍历嵌套对象

  2. Pick类型如何通过映射类型实现? 提示:通过K extends keyof T约束键集合

  3. 如何处理symbol属性映射? 提示:使用keyof T & string跳过符号键

Last updated 06 Mar 2025, 13:07 +0800 . history