我想创建一个工厂,该工厂根据给定的参数提供不同的功能。 这可以通过条件类型解决。
type DispatchConditional<TPayload> = TPayload extends undefined
? () => void
: (payload: TPayload) => void;
DispatchCondition
类型可以通过接口来检测。
interface ActionDispatcher<TPayload> {
dispatch: DispatchConditional<TPayload>;
}
如果我根据以上定义构建工厂,则使用Union-Type
会导致工厂中断。
由payloadUnion()
定义的并集类型以某种方式变为Intersection-Type
。
要为支持联合类型的方法dispatch
生成类型定义,我必须进行哪些调整?
答案 0 :(得分:3)
DispatchConditional
是distributed conditional type。这意味着DispatchConditional<number | number[]>
等效于DispatchConditional<number> | DispatchConditional<number[]>
,而
type DispatchConditional<TPayload> = [TPayload] extends [undefined]
? () => void
: (payload: TPayload) => void;
则是功能的并集。而且,函数的联合只能通过参数类型的交集来调用(由于我们不知道在运行时实际获得哪个函数,因此我们必须提供与两个函数签名一起使用的参数,从而导致交集)
简单的解决方案是通过将类型参数包装为元组类型来禁用分配行为(分配仅发生在裸类型参数上):
{{1}}