Union-Type 变为 Intersection-Type

Gre*_*ode 4 typescript conditional-types

问题

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

type DispatchConditional<TPayload> = TPayload extends undefined
  ? () => void
  : (payload: TPayload) => void;
Run Code Online (Sandbox Code Playgroud)

该类型DispatchCondition可以通过接口来检测。

interface ActionDispatcher<TPayload> {
  dispatch: DispatchConditional<TPayload>;
}
Run Code Online (Sandbox Code Playgroud)

如果我根据上面的定义构建一个工厂,如果Union-Type使用 a ,它就会崩溃。payloadUnion()不知何故,由定义的联合类型变成了Intersection-Type.

在此输入图像描述

问题

我必须进行哪些调整才能为dispatch支持联合类型的方法生成类型定义?

操场

Tit*_*mir 7

DispatchConditional分布式条件类型。这意味着DispatchConditional<number | number[]> 相当于DispatchConditional<number> | DispatchConditional<number[]>又将是函数的并集。并且函数的联合只能通过参数类型的交集来调用(因为我们不知道在运行时实际得到哪个函数,所以我们必须提供与两个函数签名一起使用的参数,从而产生交集)

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


type DispatchConditional<TPayload> = [TPayload] extends [undefined]
  ? () => void
  : (payload: TPayload) => void;
Run Code Online (Sandbox Code Playgroud)

游乐场链接