On this page
映射类型实现原理
如何通过{ [P in keyof T]: boolean }创建将对象属性全部转为布尔值的映射类型?说明Partial/Readonly等内置映射类型的底层实现逻辑
考察点分析
本题主要考察以下三个核心能力维度:
- TypeScript类型系统理解:映射类型(Mapped Types)的实现需要对TS类型操作、索引签名等有清晰认知
- 工具类型原理掌握:要求候选人能拆解内置工具类型的工作机制,理解类型修饰符操作
- 类型编程思维:考核是否能通过类型参数化、键遍历等特性进行类型转换
具体技术评估点:
- keyof操作符与索引类型查询
- 映射类型语法结构
- 属性修饰符(readonly/ional)的增删机制
- 内置工具类型的实现差异
技术解析
关键知识点
- keyof类型运算符:提取对象类型属性名的联合类型
- 映射类型语法:
[K in Keys]
形式的索引签名 - 属性修饰符操作:通过
+/-
控制readonly/ional修饰符 - 类型遍历机制:对联合类型的分布式处理特性
原理剖析
映射类型通过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]
}
常见误区
- 混淆
keyof
与Object.keys
:前者是类型运算,后者是值空间操作 - 遗漏修饰符操作:内置类型通过
+/-
显式控制修饰符状态 - 错误理解映射范围:未正确处理符号属性(如
[Symbol.iterator]
)
问题解答
通过映射类型{ [P in keyof T]: boolean }
可将对象属性全部转为布尔值:
type Booleanify<T> = {
[K in keyof T]: boolean
}
keyof T
获取T的所有属性名- 每次迭代将对应属性类型设为boolean
内置类型实现逻辑:
- Partial:添加
?
修饰符使属性可选 - Readonly:添加
readonly
修饰符使属性只读 - 通过
+/-
前缀可显式添加/移除修饰符
深度追问
如何实现递归的深层次Readonly? 提示:结合条件类型递归遍历嵌套对象
Pick类型如何通过映射类型实现? 提示:通过
K extends keyof T
约束键集合如何处理symbol属性映射? 提示:使用
keyof T & string
跳过符号键
Last updated 06 Mar 2025, 13:07 +0800 .