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

TypeScript枚举关联不同Props的类型映射问题排查

问题分析与解决方案

你当前的问题出在泛型的错误使用:直接把DrawerDataMap作为泛型参数T传入函数,导致props被要求匹配整个DrawerDataMap的结构(也就是一个包含CONTENT_A和CONTENT_B两个键的对象),但你实际传入的是对应单个枚举成员的Props,所以类型不匹配报错。

要实现「枚举成员对应不同Props类型」的需求,有两种更合理的实现方式:

方式一:使用联合类型(直观易读)

直接定义所有枚举成员对应的完整数据结构,让TypeScript自动根据content的值推导props的类型:

enum DrawerContent {
  CONTENT_A,
  CONTENT_B,
}

interface ContentAData {
  username: string;
}

interface ContentBData {
  age: number;
}

// 定义所有合法的Drawer数据组合
type DrawerDataUnion = 
  | { title: string; content: DrawerContent.CONTENT_A; props: ContentAData }
  | { title: string; content: DrawerContent.CONTENT_B; props: ContentBData };

// 函数直接接收联合类型参数
function setDrawerContent(data: DrawerDataUnion) {
  // 业务逻辑
}

// 正确调用(无报错)
setDrawerContent({
  title: 'Title for Content A',
  content: DrawerContent.CONTENT_A,
  props: { username: 'some-class' }
})

// 错误调用(触发报错)
setDrawerContent({
  title: 'Title for Content A',
  content: DrawerContent.CONTENT_A,
  props: { age: 'some-class' }
})

方式二:使用泛型+索引访问类型(适合扩展)

如果后续需要频繁添加枚举成员,这种方式更灵活,通过映射类型关联枚举和Props:

enum DrawerContent {
  CONTENT_A,
  CONTENT_B,
}

interface ContentAData {
  username: string;
}

interface ContentBData {
  age: number;
}

// 保持你的映射关系
interface DrawerDataMap {
  [DrawerContent.CONTENT_A]: ContentAData,
  [DrawerContent.CONTENT_B]: ContentBData,
}

// 泛型约束为DrawerDataMap的键(即枚举成员),通过索引访问获取对应Props类型
function setDrawerContent<K extends keyof DrawerDataMap>(data: {
  title: string;
  content: K;
  props: DrawerDataMap[K];
}) {
  // 业务逻辑
}

// 正确调用(自动推导类型,无报错)
setDrawerContent({
  title: 'Title for Content A',
  content: DrawerContent.CONTENT_A,
  props: { username: 'some-class' }
})

// 错误调用(触发报错)
setDrawerContent({
  title: 'Title for Content A',
  content: DrawerContent.CONTENT_A,
  props: { age: 'some-class' }
})

为什么原代码会报错?

原函数setDrawerContent<T>(data: DrawerData<T>)中,你手动指定T为DrawerDataMap,这意味着props的类型被设置为整个DrawerDataMap对象(结构为{ [CONTENT_A]: ContentAData; [CONTENT_B]: ContentBData }),但你传入的{ username: 'some-class' }完全不符合这个结构,因此TypeScript抛出错误。

内容的提问来源于stack exchange,提问作者Mike K

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.03 20:40:32