UNPKG

omnimatch

Version:

TypeScript tagged-union utility knife

47 lines (46 loc) 2.17 kB
/** * Delegate handling of an input to a function based on the value of a discriminant property. * * The value of the input's discriminant is used to index into the pattern to retrieve a * function to handle the input. * * If no entry exists in the pattern for the discriminant of the input, then `undefined` is * returned. If no `discriminant` is provided, then the string "kind" is used as the default * discriminant. * * @param input a value with a type discriminated by the {@link discriminator} * @param pattern a map from discriminator values to a delegate function to handle that value * @param discriminant the property name to use as the discriminant (`"kind"` if not provided) */ export declare function match<DiscriminatedUnion extends { [K in Discriminant]: string | number; }, Pattern extends Partial<{ [K in DiscriminatedUnion[Discriminant]]: (v: Extract<DiscriminatedUnion, { kind: K; }>) => any; }>, Discriminant extends string | number = "kind">(input: DiscriminatedUnion, pattern: Exclude<keyof Pattern, DiscriminatedUnion[Discriminant]> extends never ? Pattern : Partial<{ [K in DiscriminatedUnion[Discriminant]]: (v: Extract<DiscriminatedUnion, { kind: K; }>) => any; }>, discriminant?: Discriminant): typeof pattern extends { [K in DiscriminatedUnion[Discriminant]]: (v: Extract<DiscriminatedUnion, { kind: K; }>) => infer Res; } ? string extends DiscriminatedUnion[Discriminant] ? Res | undefined : unknown extends Res ? undefined : Res : typeof pattern extends Partial<{ [K in DiscriminatedUnion[Discriminant]]: (v: Extract<DiscriminatedUnion, { kind: K; }>) => infer Res; }> ? unknown extends Res ? undefined : Res | undefined : never; export declare function factory<Union extends { [K in Discriminant]: string | number; }, Discriminant extends string | number = "kind">(discriminant?: Discriminant): { [K in Union[Discriminant]]: (fields: { [Field in Exclude<keyof Extract<Union, { kind: K; }>, Discriminant>]: Extract<Union, { kind: K; }>[Field]; }) => Extract<Union, { kind: K; }>; };