映射类型 { [K in keyof T]: T[K] } 遍历 T 的每个键生成新类型,可在键与值上加修饰:加 ? 得 Partial、加 readonly 得 Readonly、用 -? 与 -readonly 移除修饰(Required 就是这样实现的)。键还可用 as 重映射:{ [K in keyof T as get${Capitalize<string & K>}]: () => T[K] } 批量生成 getter 类型。

手写示例:type MyPartial = { [K in keyof T]?: T[K] }。结合条件类型可按值过滤键,比如只保留函数类型的成员。易错点:keyof 对联合类型取的是共有键而非全部键;对数组和元组的同构映射会保留其结构;string & K 交叉用于把键收窄到字符串。追问:同构与非同构映射的区别、与模板字面量类型组合生成 onXxx 事件名的案例。

type Getters<T> = { [K in keyof T as `get${Capitalize<string & K>}`]: () => T[K] }