CodeWalk

TypeScript 映射类型(Mapped Types)与 keyof 用法

作者:古法程序员 · 2026-05-30 12:55

请解释 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 模型定义等。