如何在TypeScript中基于Record<K, T>的键定义类型?
解决TypeScript中用户类型与专属统计类型的精确映射问题
你当前用Record<User, UserStats | AdminStats | ModeratorStats>得到的结果是每个用户类型键都对应三种统计类型的联合,导致每个键可以接受任意一种统计类型,无法实现“每个用户类型对应专属属性”的需求。下面是两种精准实现的方案:
方案一:直接定义精确映射类型
最直观的方式是直接写出每个用户类型对应的专属统计类型,类型检查严格且可读性高:
type UserStats = { timeOnline: string; }; type AdminStats = { timeAdmining: string; }; type ModeratorStats = { timeModerating: string; }; // 直接绑定每个用户类型与对应的统计类型 type Stats = { USER: UserStats; ADMIN: AdminStats; MODERATOR: ModeratorStats; };
方案二:基于User联合类型的条件映射
如果已经存在User联合类型,想要基于它自动生成对应类型,可以用TypeScript的条件映射类型,遍历联合类型的每个成员并匹配对应的统计类型:
type UserStats = { timeOnline: string; }; type AdminStats = { timeAdmining: string; }; type ModeratorStats = { timeModerating: string; }; type User = 'USER' | 'ADMIN' | 'MODERATOR'; // 遍历User联合类型,为每个成员匹配专属统计类型 type Stats = { [K in User]: K extends 'USER' ? UserStats : K extends 'ADMIN' ? AdminStats : ModeratorStats };
效果验证
现在创建Stats实例时,每个键只能赋值对应的统计类型,不符合的赋值会被TypeScript报错拦截:
// 合法示例:每个键对应正确的统计类型 const validStats: Stats = { USER: { timeOnline: '12小时' }, ADMIN: { timeAdmining: '8小时' }, MODERATOR: { timeModerating: '10小时' } }; // 非法示例:USER键赋值AdminStats会报错 const invalidStats: Stats = { USER: { timeAdmining: '5小时' }, // TypeScript报错:类型不匹配 ADMIN: { timeAdmining: '8小时' }, MODERATOR: { timeModerating: '10小时' } };
内容的提问来源于stack exchange,提问作者MAR
相关产品推荐
相关产品推荐

