You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.16 19:01:24