EventFromWhen<EM extends EventMapBase, W extends When<EM>>
typeExtracts the event union from a When matcher, for typing a handler from its matcher.
{ channelPattern } resolves to the whole EventUnion: a pattern is untyped by
construction, and the whole union is exactly what a middleware handler receives, which is the
only consumer a pattern can reach. It used to fall through to never.Definition
type
type EventFromWhen<EM extends EventMapBase, W extends When<EM>> = W extends { any: true } ? EventUnion<EM> : W extends { keys: ReadonlyArray<K> } ? K extends readonly [C, T] ? C extends keyof EM & string ? T extends keyof EM[C] & string ? Event<EM, C, T> : never : never : never : W extends { channel: C } ? C extends keyof EM & string ? { [T in keyof EM[C] & string]: Event<EM, C, T> }[keyof EM[C] & string] : never : W extends { channels: ReadonlyArray<C> } ? C extends keyof EM & string ? { [T in keyof EM[C] & string]: Event<EM, C, T> }[keyof EM[C] & string] : never : W extends { channelPattern: string } ? EventUnion<EM> : neverW extends { any: true } ? EventUnion<EM> : W extends { keys: ReadonlyArray<K> } ? K extends readonly [C, T] ? C extends keyof EM & string ? T extends keyof EM[C] & string ? Event<EM, C, T> : never : never : never : W extends { channel: C } ? C extends keyof EM & string ? { [T in keyof EM[C] & string]: Event<EM, C, T> }[keyof EM[C] & string] : never : W extends { channels: ReadonlyArray<C> } ? C extends keyof EM & string ? { [T in keyof EM[C] & string]: Event<EM, C, T> }[keyof EM[C] & string] : never : W extends { channelPattern: string } ? EventUnion<EM> : never
Type parameters
| Name | Type | Description |
|---|---|---|
EM | extends EventMapBase | Event map. |
W | extends When<EM> | When matcher type. |