Record<K, V>
最后更新:2026-10-22
Record<K, V> Record
Record<K, V> 构造一个"键为 K、值为 V"的对象类型。K 可以是字面量联合(枚举映射表)或 string/number(开放缓存对象)。相比手写索引签名,Record 让键和值类型一处声明、处处复用。
| 分组 | 工具类型 |
|---|---|
| 类型 | 类型 |
| 严格模式 | 不需要 |
ℹ️ 说明 编辑器将 TypeScript 转译为 JavaScript 后运行(不做类型检查);类型检查结果见示例 Output。
📝 语法
type Record<K extends string | number | symbol, V> = {
[P in K]: V;
};
// 用法
type Timeout = Record<"dev" | "staging" | "prod", number>;
type Cache = Record<string, number>;
⚙️ 参数
| K | 键类型:字面量联合时每个键都必备;string/number/symbol 时为开放键集合 |
|---|---|
| V | 所有键共用的值类型 |
返回值:一个映射类型:键为 K 中的每个成员,值类型均为 V。
▶ 示例
修改下面的代码,点击试一试查看转译运行结果:
输出:
15000 3000
128
(转译后运行输出;Record<Env, number> 要求三个键齐全,漏掉 staging 会得到 error TS2739)
💡 要点
ℹ️ 说明 实现:type Record<K, V> = { [P in K]: V }——映射类型把 K 的每个键都映射成 V。所以 Record<"a"|"b", number> 要求 a 和 b 都必须有。
⚠️ 注意 Record<string, V> 访问任意键都返回 V 而非 V | undefined(实际可能没有这个键)。strict 模式下可开 noUncheckedIndexedAccess 让索引访问结果带上 undefined,更接近真实。
💡 提示 想"键值互换"或从对象反推键联合:keyof typeof obj 拿键联合,Record<keyof typeof obj, NewValue> 造同构表。常用于把枚举值映射到展示文案。
🏷️ 相关工具类型
💡 相关案例
更多案例即将上线。
📚 相关教程
❓ 常见问题
Q Record<K, V> 和 { [key: string]: V } 索引签名有什么区别?
A K 是字面量联合时,Record 要求每个键都出现(完备性检查),索引签名没有这个约束;两者在 K 为 string 时类型上等价。需要"键必须齐全"就用字面量联合 Record。
Q Record 的值可以各不相同吗?
A Record 要求所有键共用一个 V。键值各异的场景用映射类型:{ [K in Env]: { url: string; retries: number } },或先用 interface 声明再 Record<Env, Config> 复用。
Q Record 可以用 Map 代替吗?
A 看场景:键固定、要序列化为 JSON、想享受完备性检查,用 Record;键运行时动态增长、需要任意类型键、频繁增删,用 Map(Map<string, number>)。两者类型语义不同,不要混着比。