ts中枚举与类型的组合使用,大家通常怎么写?

const enum EventList {
    aa,bb,cc,dd,ee
}

type EventDataType = {
    event:EventList // 当event不同时,参数的数量也不同
    par1:string
    par2:number
} & (
  {
      event:EventList.aa
      par1:`data_${number}`
      par2:number
  } | {
      event:EventList.bb
      par1:`array_${number}`
      par2:number
      par3:number[]
  }
)
function listen(event:EventList, callback:(data:EventDataType)=>void):void
// 以及代码中的使用片段
{
    let data:EventDataType
    switch(value){
        case 0:case 1:
            data = {
              event:EventList.aa,
              par1:'data_11',
              par2:value
            }
        break;
        case 2:case 3:
            data = {
              event:EventList.bb,
              par1:'array_11',
              par2:value,
                par3:[1,2,3]
            }
        break;
    }
}

我现在希望重写listen的声明,使得两个参数可以关联起来,就像

function listen<T extends keyof EventList>(event:T, callback:(data:EventDataType<T>)=>void):void

但是突然一下子到处都飘红了。希望有个比较理想的处理方案,请各位大佬帮帮我

阅读 1.4k
1 个回答

不知道你要的是不是这个。

const enum EventList {
    aa,bb,cc,dd,ee
}

type EventDataType = {
    event:EventList // 当event不同时,参数的数量也不同
    par1:string
    par2:number
} & (
  {
      event:EventList.aa
      par1:`data_${number}`
      par2:number
  } | {
      event:EventList.bb
      par1:`array_${number}`
      par2:number
      par3:number[]
  }
)

type CurrentEvent<
  T extends { event: EventList },
  U extends T["event"]
> = T extends T ? (U extends T["event"] ? T : never) : never;

function listen<T extends EventDataType["event"]>(
  event: T,
  callback: (data: CurrentEvent<EventDataType, T>) => void
): void;
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进