keyof、映射类型、条件类型与 infer 怎么配合?
先理解原理和示例,再练习完整口述与追问。
回答要点
键集合与索引访问;逐键转换;按类型条件选择;infer 提取局部类型;分布式条件边界。
原理拆解
keyof T 得到键类型集合,T[K] 得到相应值类型;映射类型遍历键集合生成新结构。条件类型 T extends U ? X : Y 根据类型关系选择结果;infer 在条件匹配位置提取类型。裸类型参数参与某些联合条件时会分布到各成员,包成元组可用于阻止这种分布;这些都是类型运算,运行时不存在。
示例与推演
type Optional<T> = { [K in keyof T]?: T[K] }
type ElementOf<T> = T extends readonly (infer U)[] ? U : never
type Item = ElementOf<readonly { id: string }[]> // { id: string }
Optional 保留原字段类型但变为可选;ElementOf 匹配数组并提取元素,不匹配返回 never。复杂递归类型应关注编译性能和团队可读性。
易错点
类型工具不处理运行时值,也不自动验证 JSON。不要用极复杂类型只为省一行清晰接口。
参考回答可直接练习口述
我用 keyof 和索引类型保持字段关系,用映射类型批量变换,用条件与 infer 提取结构;遇到联合时检查是否分布。工具服务于准确契约和推断,不能代替运行时实现。