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>)。两者类型语义不同,不要混着比。
Web-Tutorial.com

Web-Tutorial 技术团队

由多位开发者共同维护的编程教程平台。每篇教程由对应领域的开发者编写和审核,确保内容准确可靠。如发现任何问题,欢迎向我们反馈。

100%

🙏 帮我们做得更好

我们是刚上线的编程教程站,几个人的小团队,精力有限。页面虽经检查,难免还有疏漏——链接失效、排版错乱、内容有误、语言生硬……

如果您发现了,麻烦告诉我们,我们会在收到反馈后第一时间进行修复,再次感谢您的光临 🙏