Record<K, T> 是 TypeScript 内置工具类型,用于定义键为 K、值统一为 T 的映射对象类型;其本质是映射类型 { [P in K]: T },支持字面量联合、string/number/symbol 等合法键类型,常用于状态映射、权限配置等场景。

Record 是 TypeScript 中最常用的内置工具类型之一,专门用来快速定义“键名固定、值类型统一”的映射表对象类型。
Record 的基本用法:两个泛型参数
它的定义是:type Record<k extends keyof any t> = { [P in K]: T };</k>。简单说,它接收两个参数:
-
K:键的联合类型(如
'a' | 'b' | 'c'或string),必须是合法的属性键(即keyof any的子类型) -
T:所有键对应值的统一类型(如
number、string、UserInfo等)
常见使用场景举例
比如要定义一个用户状态码到中文描述的映射类型:
type StatusMap = Record<'success' | 'error' | 'loading', string>;等价于手动写:
完整的Galileo AI平台 TypeScript/JS SDK 参考,用于评估、观察和保护 GenAI 应用。适用于构建 Node.js 或 TypeScript 项目。
再比如定义一个配置项对象,键是字符串字面量,值都是布尔值:
type FeatureFlags = Record<'darkMode' | 'analytics' | 'notifications', boolean>;灵活组合:配合 keyof 和类型推导
你可以用 keyof 自动提取已有类型的键,避免重复写字面量:
type UserFieldRequired = Record<keyof User, boolean>; // { id: boolean; name: boolean; email: boolean; }
注意:如果键类型是 string,就退化为普通索引签名:Record<string, number> ≈ { [k: string]: number }。
注意事项和易错点
- 键类型不能是任意联合类型——比如
number | string会报错,因为不是keyof any的有效子类型;但string、number、symbol或字面量联合都合法 - 空联合类型
never是允许的,结果是空对象类型{} - 不要混淆
Record<K, T>和Map<K, T>——前者是对象类型,后者是运行时的 Map 实例类型

















