diff --git a/src/exhaustive.ts b/src/exhaustive.ts index 4443d76..00d17c7 100644 --- a/src/exhaustive.ts +++ b/src/exhaustive.ts @@ -6,8 +6,6 @@ type ParseValue = : Value extends 'false' ? false : Value; -type AnyFunction = (...args: any[]) => unknown; - export type ExhaustiveUnion = { [Key in `${Union}`]: (value: ParseValue) => any; } & ExhaustiveDefaultCase; @@ -47,17 +45,13 @@ function hasDefaultCase( function exhaustive< Union extends string | boolean, Cases extends ExhaustiveUnion = ExhaustiveUnion, - Output = Cases[keyof Cases] extends AnyFunction ? - ReturnType - : never, + Output = ReturnType, >(union: Union, match: ValidateKeys>): Output; function exhaustive< Union extends object, Tag extends keyof Union, Cases extends ExhaustiveTag = ExhaustiveTag, - Output = Cases[keyof Cases] extends AnyFunction ? - ReturnType - : never, + Output = ReturnType, >( union: Union, tag: Tag, @@ -69,27 +63,26 @@ function exhaustive( cases?: object, ) { if (typeof cases !== 'undefined') { - const object = unionOrObject as object; - const keyOfUnion = casesOrKeyofUnion as keyof typeof object; - - return exhaustive.tag(object, keyOfUnion, cases); + return exhaustive.tag( + unionOrObject as object, + casesOrKeyofUnion as never, + cases, + ); } const union = unionOrObject as string; - const unionCases = casesOrKeyofUnion as object; + const $cases = casesOrKeyofUnion as object; const matchesKey: boolean = Object.prototype.hasOwnProperty.call( - unionCases, + $cases, union, ); if (!matchesKey) { - return hasDefaultCase(unionCases) ? - unionCases._() - : corrupt(union as never); + return hasDefaultCase($cases) ? $cases._() : corrupt(union as never); } - const event = unionCases[union]; + const event = $cases[union]; return event(union); } @@ -98,9 +91,7 @@ exhaustive.tag = < Union extends object, Tag extends keyof Union, Cases extends ExhaustiveTag = ExhaustiveTag, - Output = Cases[keyof Cases] extends AnyFunction ? - ReturnType - : never, + Output = ReturnType, >( union: Union, tag: Tag,