Record 是 TypeScript 中用于精确约束对象键名和值类型的工具类型,仅在编译期生效;其泛型 Record<K, T> 要求 K 为 string/number/symbol 或其字面量联合,T 为统一值类型;支持用 keyof 动态推导键,且默认要求所有键必须存在。

TypeScript 中的 Record 是一个内置的工具类型,用于**精确约束对象的键名类型和对应值的类型**,特别适合定义“键值对结构固定、但键名可能动态生成”的对象。它不是用来做运行时校验的,而是在编译期帮你捕获结构错误。
Record 的基本用法:指定键类型和值类型
Record<K, T> 接收两个泛型参数:
-
K:键的类型(必须是
string、number、symbol或它们的联合/字面量类型) - T:所有键对应值的统一类型
例如:
type UserStatusMap = Record<"active" | "inactive" | "pending", boolean>;等价于手动写:
立即学习“Java免费学习笔记(深入)”;
type UserStatusMap = { active: boolean; inactive: boolean; pending: boolean; };但前者更简洁、可复用,且类型推导更清晰。
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
用字符串字面量联合类型控制合法键名
这是最常见也最实用的场景:防止对象中出现非法字段。
type Role = "admin" | "editor" | "viewer";type Permissions = Record<Role, string[]>;
此时下面的写法会报错:
const perms: Permissions = {admin: ["read", "write"],
editor: ["read"],
viewer: ["read"],
guest: ["read"] // ❌ 错误:'guest' 不在 Role 类型中
};
配合 keyof 和接口动态生成键类型
避免硬编码字面量,让类型更易维护:
interface FeatureFlags {darkMode: boolean;
analytics: boolean;
notifications: boolean;
}
type FlagStatus = Record<keyof FeatureFlags, boolean>;
这样 FlagStatus 就自动对应 { darkMode: boolean; analytics: boolean; notifications: boolean; },接口改了,类型自动同步。
注意 Record 不要求键必须全部存在(默认是可选)
Record 默认允许部分键缺失 —— 它等价于 Partial<{ ... }>。如果需要强制所有键都存在,直接使用即可(因为 Record 本身不加 ?),但初始化时仍需提供全部键值,否则会报错:
若想允许部分键,可显式包装:Partial<Record<K, T>>;若想允许额外键,就别用 Record,改用索引签名如 { [k in K]: T } 或更宽松的 { [key: string]: T }。

















