Workaround for 20 Argument Limit in `pipe` with Exhaustiveness Checking

Is there a way to get around the 20 argument pipe limit when using a Match and still get exhaustiveness checking? I have some fairly sizeable enums that hit this limit

import { Match } from 'effect';

enum TestEnum {
  value1 = 'value1',
  value2 = 'value2',
  value3 = 'value3',
  value4 = 'value4',
  value5 = 'value5',
  value6 = 'value6',
  value7 = 'value7',
  value8 = 'value8',
  value9 = 'value9',
  value10 = 'value10',
  value11 = 'value11',
  value12 = 'value12',
  value13 = 'value13',
  value14 = 'value14',
  value15 = 'value15',
  value16 = 'value16',
  value17 = 'value17',
  value18 = 'value18',
  value19 = 'value19',
  value20 = 'value20',
}

// This will fail with TypeScript error TS2554: Expected 0-20 arguments, but got 21
const formatValue = (value: TestEnum): string =>
  Match.value(value).pipe(
    Match.when(TestEnum.value1, () => 'Value 1'),
    Match.when(TestEnum.value2, () => 'Value 2'),
    Match.when(TestEnum.value3, () => 'Value 3'),
    Match.when(TestEnum.value4, () => 'Value 4'),
    Match.when(TestEnum.value5, () => 'Value 5'),
    Match.when(TestEnum.value6, () => 'Value 6'),
    Match.when(TestEnum.value7, () => 'Value 7'),
    Match.when(TestEnum.value8, () => 'Value 8'),
    Match.when(TestEnum.value9, () => 'Value 9'),
    Match.when(TestEnum.value10, () => 'Value 10'),
    Match.when(TestEnum.value11, () => 'Value 11'),
    Match.when(TestEnum.value12, () => 'Value 12'),
    Match.when(TestEnum.value13, () => 'Value 13'),
    Match.when(TestEnum.value14, () => 'Value 14'),
    Match.when(TestEnum.value15, () => 'Value 15'),
    Match.when(TestEnum.value16, () => 'Value 16'),
    Match.when(TestEnum.value17, () => 'Value 17'),
    Match.when(TestEnum.value18, () => 'Value 18'),
    Match.when(TestEnum.value19, () => 'Value 19'),
    Match.when(TestEnum.value20, () => 'Value 20'),
    Match.exhaustive, // This becomes the 21st argument, causing the error
  );
Was this page helpful?