record 是 typescript 中用于字典对象的工具类型,通过字符串字面量联合类型限定键、支持任意值类型,并需 k 为合法键类型,常与 partial、readonly 等组合使用。

Record 是 TypeScript 里专为字典类对象设计的工具类型,核心作用就是给“键值映射结构”加上精准、可维护的类型约束。它不依赖运行时逻辑,纯编译期检查,写对了就能立刻捕获键名拼错、值类型不符、漏定义等常见错误。
明确键的范围:用字符串字面量联合类型限定 key
大多数业务字典(如状态码、路由名、权限标识)的 key 是有限且已知的。直接用 string 作为键类型太宽泛,容易写错或漏覆盖。正确做法是先定义键集合,再传给 Record:
- 定义合法键:type StatusKey = 'pending' | 'paid' | 'shipped' | 'finished';
- 构造字典类型:type StatusTextMap = Record
; - 使用时自动校验:const map: StatusTextMap = { pending: '待支付', paid: '已支付' }; —— 若多写一个
'cancelled'或漏掉'shipped',TS 编译器会立刻报错
统一值类型:支持任意类型,不只是基础类型
Record 的值类型 T 可以是 string、number、boolean,也可以是接口、class、函数甚至联合类型。只要所有 value 都符合这个类型,就通过检查:
- 值为对象:type UserConfig = { theme: string; lang: string; }; type ConfigMap = Record;
- 值为函数:type Handler = (id: string) => Promise
; type ActionMap = Record; - 值为可选类型:type FieldErrorMap = Record;(允许值为 string 或 undefined)
避免泛型滥用:K 必须是合法对象键类型
Record 第一个泛型参数 K 并非任意类型。它必须能被 JavaScript 对象接受为 key,即只能是 string、number、symbol 或它们的联合(包括字符串字面量)。以下写法是非法的:
- ❌ type Bad = Record;(对象不能作 key 类型)
-
❌ type Bad2 = Record
; (boolean 会被转成字符串 "true"/"false",但 TS 不允许 boolean 作为 K) - ✅ type Good = Record;(字符串字面量 + 数字字面量,合法)
配合其他工具类型增强表达力
Record 很少单独使用,常和 Partial、Readonly、Pick 等组合,适应不同场景:
- 允许部分键存在:type OptionalStatus = Partial
>; (即 { pending?: string; paid?: string }) - 禁止修改字典:type ConstMap = Readonly
>; - 从已有接口抽字段做映射:interface Role { id: string; name: string; level: number; } type RoleNameMap = Record
;










