【问题标题】:Union-Type turns into Intersection-TypeUnion-Type 变成 Intersection-Type
【发布时间】:2020-05-05 01:29:26
【问题描述】:

问题

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

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

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

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

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

问题

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

游乐场

【问题讨论】:

    标签: typescript conditional-types


    【解决方案1】:

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

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

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

    Playground Link

    【讨论】:

    • 哇,答案真快。非常感谢!
    猜你喜欢
    • 2021-07-02
    • 2021-04-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-08-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多