映射类型(Mapped Types)是什么?Pick/Omit/Record/Partial 是怎么实现的?
映射类型用 in keyof 遍历已有类型的键,逐个变换:
type MyPartial<T> = { [K in keyof T]?: T[K] }
type MyReadonly<T> = { readonly [K in keyof T]: T[K] }
type MyPick<T, K extends keyof T> = { [P in K]: T[P] }
type MyRecord<K extends keyof any, V> = { [P in K]: V }
interface User { id: number; name: string; age: number }
type P = MyPartial<User> // { id?: number; name?: string; age?: number }
type R = MyRecord<'a' | 'b', number> // { a: number; b: number }配合 key remapping { [K in keyof T as ...]: ... } 还能改名(如 Getters<T> 给每个属性生成 getX)。这些是 TS 内置工具类型的实现原理。