Conditional dist N=50

Distributive conditional types over broad unions.

tsz is 6.5x faster 82 lines 1 KB

Timing

tsz
59.06ms
tsgo
386.49ms

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;