Skip to content

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

Open
@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 TypeScript

    Type

    No type

    Projects

    No projects

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions