联合类型变为交叉点类型

时间:2020-05-04 17:24:03

标签: typescript conditional-types

问题

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

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

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

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

如果我根据以上定义构建工厂,则使用Union-Type会导致工厂中断。 由payloadUnion()定义的并集类型以某种方式变为Intersection-Type

enter image description here

问题

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

游乐场

1 个答案:

答案 0 :(得分:3)

DispatchConditionaldistributed conditional type。这意味着DispatchConditional<number | number[]>等效于DispatchConditional<number> | DispatchConditional<number[]>,而 type DispatchConditional<TPayload> = [TPayload] extends [undefined] ? () => void : (payload: TPayload) => void; 则是功能的并集。而且,函数的联合只能通过参数类型的交集来调用(由于我们不知道在运行时实际获得哪个函数,因此我们必须提供与两个函数签名一起使用的参数,从而导致交集)

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

{{1}}

Playground Link