Typescript 并集类型变为交集类型 问题

Typescript 并集类型变为交集类型 问题,typescript,conditional-types,Typescript,Conditional Types,我想创建一个工厂,根据给定的参数提供不同的功能。 这可以通过条件类型来解决 type DispatchConditional<TPayload> = TPayload extends undefined ? () => void : (payload: TPayload) => void; 如果我基于上面的定义构建工厂,如果使用联合类型,它将中断。 不知怎的,payloadUnion()定义的联合类型变成了交叉点类型 问题: 要为支持联合类型的方法dispat

我想创建一个工厂,根据给定的参数提供不同的功能。 这可以通过条件类型来解决

type DispatchConditional<TPayload> = TPayload extends undefined
  ? () => void
  : (payload: TPayload) => void;
如果我基于上面的定义构建工厂,如果使用
联合类型,它将中断。
不知怎的,
payloadUnion()
定义的联合类型变成了
交叉点类型

问题: 要为支持联合类型的方法
dispatch
生成类型定义,我必须做哪些调整

游乐场

DispatchConditional
是一个。这意味着
DispatchConditional
相当于
DispatchConditional | DispatchConditional
,而后者又是函数的联合。函数的并集只能通过参数类型的交集调用(因为我们不知道在运行时实际得到哪个函数,所以我们必须提供与两个函数签名一起工作的参数,从而产生交集)

简单的解决方案是禁用分发行为,方法是将类型参数包装在元组类型中(分发仅发生在裸类型参数上):


类型DispatchConditional=[TPayload]扩展[undefined]
? ()=>无效
:(有效载荷:TPayload)=>无效;

DispatchConditional
是一个。这意味着
DispatchConditional
相当于
DispatchConditional | DispatchConditional
,而后者又是函数的联合。函数的并集只能通过参数类型的交集调用(因为我们不知道在运行时实际得到哪个函数,所以我们必须提供与两个函数签名一起工作的参数,从而产生交集)

简单的解决方案是禁用分发行为,方法是将类型参数包装在元组类型中(分发仅发生在裸类型参数上):


类型DispatchConditional=[TPayload]扩展[undefined]
? ()=>无效
:(有效载荷:TPayload)=>无效;

哇,回答得真快。非常感谢你!哇,多快的回答啊。非常感谢你!
interface ActionDispatcher<TPayload> {
  dispatch: DispatchConditional<TPayload>;
}

type DispatchConditional<TPayload> = [TPayload] extends [undefined]
  ? () => void
  : (payload: TPayload) => void;