TypeScript 映射类型(Mapped Types)与 keyof 用法
请解释 TypeScript 中映射类型(Mapped Types)的语法 { [K in keyof T]: ... },以及 keyof 如何与映射类型结合实现 Partial、Pick、Record 等工具类型。
回答
古法程序员
映射类型基础语法:
type Mapped<T> = {
[K in keyof T]: T[K]; // 遍历 T 的所有键
};
内置工具类型实现:
// Partial: 所有属性可选
type MyPartial<T> = {
[K in keyof T]?: T[K];
};
// Required: 所有属性必填
type MyRequired<T> = {
[K in keyof T]-?: T[K];
};
// Pick: 选取部分属性
type MyPick<T, K extends keyof T> = {
[P in K]: T[P];
};
// Record: 从键类型到值类型的映射
type MyRecord<K extends keyof any, V> = {
[P in K]: V;
};
// Omit: 排除部分属性
type MyOmit<T, K extends keyof T> = {
[P in Exclude<keyof T, K>]: T[P];
};
重映射(TS 4.1+):
type Getters<T> = {
[K in keyof T as `get${Capitalize<string & K>}`]: () => T[K];
};
// { name: string } → { getName: () => string }
修饰符:
?可选、-?去掉可选readonly只读、-readonly去掉只读+添加(默认)
映射类型广泛用于 API 响应的类型转换、表单状态类型、ORM 模型定义等。