Conditional dist N=50
Distributive conditional types over broad unions.
tsz is 6.5x faster 82 lines 1 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';
// 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;