Conditional dist N=95
Distributive conditional types over broad unions.
tsz is 6.1x faster 127 lines 2 KB
Timing
Files
// Conditional type distribution stress test
// Tests large union distribution in conditional types
type ExtractString<T> = T extends string ? T : never;
type ExtractNumber<T> = T extends number ? T : never;
type ExtractArrayType<T> = T extends (infer U)[] ? U : never;
type ToArray<T> = T extends any ? T[] : never;
type Flatten<T> = T extends (infer U)[] ? Flatten<U> : T;
type BigUnion =
| 'value0'
| 'value1'
| 'value2'
| 'value3'
| 'value4'
| 'value5'
| 'value6'
| 'value7'
| 'value8'
| 'value9'
| 'value10'
| 'value11'
| 'value12'
| 'value13'
| 'value14'
| 'value15'
| 'value16'
| 'value17'
| 'value18'
| 'value19'
| 'value20'
| 'value21'
| 'value22'
| 'value23'
| 'value24'
| 'value25'
| 'value26'
| 'value27'
| 'value28'
| 'value29'
| 'value30'
| 'value31'
| 'value32'
| 'value33'
| 'value34'
| 'value35'
| 'value36'
| 'value37'
| 'value38'
| 'value39'
| 'value40'
| 'value41'
| 'value42'
| 'value43'
| 'value44'
| 'value45'
| 'value46'
| 'value47'
| 'value48'
| 'value49'
| 'value50'
| 'value51'
| 'value52'
| 'value53'
| 'value54'
| 'value55'
| 'value56'
| 'value57'
| 'value58'
| 'value59'
| 'value60'
| 'value61'
| 'value62'
| 'value63'
| 'value64'
| 'value65'
| 'value66'
| 'value67'
| 'value68'
| 'value69'
| 'value70'
| 'value71'
| 'value72'
| 'value73'
| 'value74'
| 'value75'
| 'value76'
| 'value77'
| 'value78'
| 'value79'
| 'value80'
| 'value81'
| 'value82'
| 'value83'
| 'value84'
| 'value85'
| 'value86'
| 'value87'
| 'value88'
| 'value89'
| 'value90'
| 'value91'
| 'value92'
| 'value93'
| 'value94';
// Distributive conditional type applications
type Distributed1 = ToArray<BigUnion>;
type Distributed2 = ExtractString<BigUnion | number>;
type ChainedConditional<T> =
T extends string ? `prefix_${T}` :
T extends number ? T :
T extends boolean ? (T extends true ? 1 : 0) :
never;
type Applied = ChainedConditional<BigUnion>;
// Nested conditional
type NestedConditional<T> =
T extends `value${infer N}` ? N extends `${infer D}${infer Rest}` ? D : never : never;
type Extracted = NestedConditional<BigUnion>;
declare const distributed: Distributed1;
declare const applied: Applied;
declare const extracted: Extracted;