Skip to content

Takes a while with high memory to calculate highly recursive types with intersections #20558

@dead-claudia

Description

@dead-claudia

TypeScript Version: 2.6.2

Code

Apologies for the length - I can't really make the repro any smaller than this without it taking a fraction of the time and about half the memory. Also, note: this does not require a config.

interface Context<P, O> {
    createV(this: this & Context<P, O & {raw: true}>, attrs: P): Context<P, O>;
    createRC(this: this & Context<P, O & {raw: true}>, attrs: P, ref: (elem: P) => any): Context<P, O>;

    simpleV(this: this & Context<P, O & {raw: true}>, attrs: P): void;
    simpleRC(this: this & Context<P, O & {raw: true}>, attrs: P, ref: (elem: P) => any): void;

    add(this: this & Context<P, O & {text: true}>): void;
    raw(this: this & Context<P, O & {raw: true}>, elem: P): void;

    invokeC<C>(
        tag: Component<object, P, O>,
        children: (r: Context<P, O>, context: C) => void,
        context: C
    ): void;
    invokeAC<A extends object, C>(
        tag: Component<A, P, O>, attrs: A,
        children: (r: Context<P, O>, context: C) => void,
        context: C
    ): void;
}

interface TopContext<P, O> extends Context<P, O> {
    hasOption<K extends keyof O>(key: K): this is (this & TopContext<P, {[P in K]: O[P]}>);
}

type Component<A extends object, P, O> = <C>(
    attrs: A, r: TopContext<P, O>,
    children: (r: Context<P, O>, context: C) => void,
    context: C
) => void

interface ContextWrap<P, O> {
    instance: Context<P, O>;
}

interface TopContextWrap<P, O> extends ContextWrap<P, O> {
    instance: TopContext<P, O>;
}

Expected behavior: It to take maybe a few seconds. Remove any one function or property out of that, and that's the compilation time I would normally expect.

Actual behavior: It takes ~15-20 seconds to check, and requires ~180-200 MB of memory in the process.

Metadata

Metadata

Assignees

No one assigned

    Labels

    BugA bug in TypeScriptDomain: PerformanceReports of unusually slow behavior

    Type

    No type

    Projects

    No projects

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions