Union-Type 变成 Intersection-Type

Union-Type turns into Intersection-Type

问题

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

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

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

interface ActionDispatcher<TPayload> {
  dispatch: DispatchConditional<TPayload>;
}

如果我根据上面的定义建立一个工厂,如果使用 Union-Type 它就会崩溃。 payloadUnion() 定义的联合类型以某种方式变成了 Intersection-Type.

问题

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

游乐场

DispatchConditional 是一个 distributed conditional type。这意味着 DispatchConditional<number | number[]> 等同于 DispatchConditional<number> | DispatchConditional<number[]> ,后者又是函数的并集。并且函数的联合只能通过参数类型的交集调用(因为我们不知道在运行时我们实际得到的是哪个函数,所以我们必须提供与两个函数签名一起工作的参数,从而导致交集)

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


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

Playground Link