映射类型(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 内置工具类型的实现原理。

同分类其他题目