Skip to content

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

Description

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.

Activity

  1. mhegazy commented on Feb 2, 2018

    @mhegazy
    Contributor

    this is what i am seeing on latest in master:

    RangeError: Maximum call stack size exceeded
        at getAnonymousTypeInstantiation (C:\Users\mhegazy\AppData\Roaming\npm\node_modules\typescript\lib\tsc.js:1:1)
        at instantiateType (C:\Users\mhegazy\AppData\Roaming\npm\node_modules\typescript\lib\tsc.js:26419:32)
        at C:\Users\mhegazy\AppData\Roaming\npm\node_modules\typescript\lib\tsc.js:26261:42
        at Object.map (C:\Users\mhegazy\AppData\Roaming\npm\node_modules\typescript\lib\tsc.js:477:29)
        at getAnonymousTypeInstantiation (C:\Users\mhegazy\AppData\Roaming\npm\node_modules\typescript\lib\tsc.js:26344:40)
        at instantiateType (C:\Users\mhegazy\AppData\Roaming\npm\node_modules\typescript\lib\tsc.js:26419:32)
        at C:\Users\mhegazy\AppData\Roaming\npm\node_modules\typescript\lib\tsc.js:26261:42
        at Object.map (C:\Users\mhegazy\AppData\Roaming\npm\node_modules\typescript\lib\tsc.js:477:29)
        at getAnonymousTypeInstantiation (C:\Users\mhegazy\AppData\Roaming\npm\node_modules\typescript\lib\tsc.js:26344:40)
        at instantiateType (C:\Users\mhegazy\AppData\Roaming\npm\node_modules\typescript\lib\tsc.js:26419:32)
  2. dead-claudia commented on Feb 2, 2018

    @dead-claudia
    Author

    Mohamed Hegazy (@mhegazy) That's odd. I ran it on Mac, which from a quick Google search, has a higher default stack space limit, though - 8MB instead of 1MB. (In the release when I tested it, it did manage to eventually succeed.)

    Note that the above example should validate as successful.

  3. jakebailey commented on Jul 10, 2023

    @jakebailey
    Member

    This old issue was fixed by the surprisingly new #52392; likely this deserves a test, if anything; its compile perf is not that bad post-fix (.7s on my machine).

  4. locked as resolved and limited conversation to collaborators on Jun 5, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

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