推荐答案
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[]
类型。