Skip to content

Instantly share code, notes, and snippets.

@willmtemple
Last active February 25, 2020 03:31
Show Gist options
  • Save willmtemple/c03e2f0d7d8f2bd6648c697a678e0bd3 to your computer and use it in GitHub Desktop.
Save willmtemple/c03e2f0d7d8f2bd6648c697a678e0bd3 to your computer and use it in GitHub Desktop.
ultimateMatcher.ts
declare export function match<
DiscriminatedUnion extends { [K in Discriminator]: string | number },
Pattern extends Partial<
{
[K in DiscriminatedUnion[Discriminator]]: (
v: Extract<DiscriminatedUnion, { kind: K }>
) => any;
}
>,
Discriminator extends string | number = "kind"
>(
input: DiscriminatedUnion,
pattern: Exclude<
keyof Pattern,
DiscriminatedUnion[Discriminator]
> extends never
? Pattern
: Partial<
{
[K in DiscriminatedUnion[Discriminator]]: (
v: Extract<DiscriminatedUnion, { kind: K }>
) => any;
}
>,
discriminator?: Discriminator
): typeof pattern extends {
[K in DiscriminatedUnion[Discriminator]]: (
v: Extract<DiscriminatedUnion, { kind: K }>
) => infer Res;
}
? string extends DiscriminatedUnion[Discriminator]
? Res | undefined
: unknown extends Res
? undefined
: Res
: typeof pattern extends Partial<
{
[K in DiscriminatedUnion[Discriminator]]: (
v: Extract<DiscriminatedUnion, { kind: K }>
) => infer Res;
}
>
? Res | undefined
: never;
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment