推荐答案
Record<K, T> 是 TypeScript 中的一个实用工具类型,用于创建一个对象类型,其属性键为 K 类型,属性值为 T 类型。它通常用于定义具有特定键值对结构的对象类型。
语法
type Record<K extends keyof any, T> = {
[P in K]: T;
};示例
type UserRoles = 'admin' | 'editor' | 'viewer';
type RolePermissions = Record<UserRoles, string[]>;
const permissions: RolePermissions = {
admin: ['create', 'read', 'update', 'delete'],
editor: ['read', 'update'],
viewer: ['read']
};在这个示例中,RolePermissions 是一个对象类型,其键为 UserRoles 类型(即 'admin' | 'editor' | 'viewer'),值为 string[] 类型。
本题详细解读
实现原理
Record<K, T> 的实现原理是通过映射类型(Mapped Types)来实现的。它遍历 K 类型的所有可能值,并为每个值创建一个属性,属性的类型为 T。
K是一个联合类型,表示对象的所有可能键。T是对象属性的值类型。
使用场景
Record<K, T> 通常用于以下场景:
- 定义具有特定键值对结构的对象类型:例如,定义一个对象类型,其键为特定的字符串或数字,值为某种类型。
- 简化类型定义:当需要定义一个对象类型,且其键和值的类型较为复杂时,使用
Record<K, T>可以简化类型定义。
注意事项
K必须是keyof any的子类型,即string | number | symbol。Record<K, T>生成的类型是一个对象类型,因此不能用于定义数组或元组类型。
示例解析
在示例中,UserRoles 是一个联合类型,表示用户的角色。RolePermissions 是一个对象类型,其键为 UserRoles 类型,值为 string[] 类型。通过 Record<UserRoles, string[]>,我们定义了一个对象类型,其键为 'admin' | 'editor' | 'viewer',值为 string[] 类型。