联合类型转变为交叉类型

3

问题

我想创建一个工厂,根据给定的参数提供不同的函数。可以使用条件类型来解决这个问题。

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

DispatchCondition类型可以通过一个接口进行仪表化。

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

如果我按照上述定义建立工厂,如果使用联合类型,它将会出现问题。不知何故,由payloadUnion()定义的联合类型变成了一个交叉类型

enter image description here

问题

我需要做哪些调整来为支持联合类型的dispatch方法生成类型定义?

示例

1个回答

6
DispatchConditional是一种分布式条件类型。这意味着DispatchConditional<number | number[]>等同于DispatchConditional<number> | DispatchConditional<number[]>,进而成为函数的联合。函数的联合只能使用参数类型的交集进行调用(因为我们不知道在运行时实际得到哪个函数,所以必须提供适用于两个函数签名的参数,从而得出交集)。
简单的解决方案是通过将类型参数包装在元组类型中来禁用分布式行为(分布仅在裸类型参数上发生)。

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

游乐场链接


1
哇,回答得好快啊。非常感谢! - Gregor Woiwode

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接