Microsoft/TypeScript

Certain recursive types cause "Maximum call stack size exceeded" error in TS server

Open

#62471 opened on Sep 21, 2025

View on GitHub
 (1 comment) (0 reactions) (0 assignees)TypeScript (48,455 stars) (6,726 forks)batch import
BugDomain: Indexed Access TypesHelp Wanted

Description

🔎 Search Terms

visitType, visitObjectType, visitSymbol, RangeError, TypeScript Server Error

🕗 Version & Regression Information

  • This is the behavior in versions 5.9.2 and 6.0.0-dev.20250909

⏯ Playground Link

No response

💻 Code

I'm not sure how to reproduce this at low level. I met this error in VS Code when it stopped showing "Extract" and "Move" groups in the "Refactor..." menu. Then I looked in the extension logs and saw an error in TS Server.

Steps to reproduce are:

  1. In an empty TypeScript project (tsconfig.json may be nonexistent), create a .ts file with:
    function func<T, D>(param: ProblematicType<T, D>) {}
    
    type ProblematicType<T, D> = {
      prop: ProblematicType<T[keyof T], any>;
    };
    
    class TestRefactoring<T> {
      createElement() {
        document.createElement('span');
      }
    }
    
  2. Select document.createElement('span');
  3. Make a right click on the selection
  4. Click "Refactor..."

🙁 Actual behavior

  1. "Refactor..." menu:
  2. Extension Host logs in VS Code:
    [error] [vscode.typescript-language-features] provider FAILED
    [error] Error: <semantic> TypeScript Server Error (6.0.0-dev.20250909)
    Maximum call stack size exceeded
    RangeError: Maximum call stack size exceeded
        at instantiateType (<redacted>\.vscode\extensions\ms-vscode.vscode-typescript-next-6.0.20250909\node_modules\typescript\lib\typescript.js:68177:27)
        at instantiateTypeWorker (<redacted>\.vscode\extensions\ms-vscode.vscode-typescript-next-6.0.20250909\node_modules\typescript\lib\typescript.js:68263:9)
        at instantiateTypeWithAlias (<redacted>\.vscode\extensions\ms-vscode.vscode-typescript-next-6.0.20250909\node_modules\typescript\lib\typescript.js:68210:20)
        at instantiateType (<redacted>\.vscode\extensions\ms-vscode.vscode-typescript-next-6.0.20250909\node_modules\typescript\lib\typescript.js:68178:29)
        at getMappedType (<redacted>\.vscode\extensions\ms-vscode.vscode-typescript-next-6.0.20250909\node_modules\typescript\lib\typescript.js:67858:67)
        at <redacted>\.vscode\extensions\ms-vscode.vscode-typescript-next-6.0.20250909\node_modules\typescript\lib\typescript.js:67987:56
        at map (<redacted>\.vscode\extensions\ms-vscode.vscode-typescript-next-6.0.20250909\node_modules\typescript\lib\typescript.js:2492:19)
        at getObjectTypeInstantiation (<redacted>\.vscode\extensions\ms-vscode.vscode-typescript-next-6.0.20250909\node_modules\typescript\lib\typescript.js:67987:29)
        at instantiateTypeWorker (<redacted>\.vscode\extensions\ms-vscode.vscode-typescript-next-6.0.20250909\node_modules\typescript\lib\typescript.js:68235:16)
        at instantiateTypeWithAlias (<redacted>\.vscode\extensions\ms-vscode.vscode-typescript-next-6.0.20250909\node_modules\typescript\lib\typescript.js:68210:20)
        at instantiateType (<redacted>\.vscode\extensions\ms-vscode.vscode-typescript-next-6.0.20250909\node_modules\typescript\lib\typescript.js:68178:29)
        at getTypeOfInstantiatedSymbol (<redacted>\.vscode\extensions\ms-vscode.vscode-typescript-next-6.0.20250909\node_modules\typescript\lib\typescript.js:61397:40)
        at getTypeOfSymbol (<redacted>\.vscode\extensions\ms-vscode.vscode-typescript-next-6.0.20250909\node_modules\typescript\lib\typescript.js:61461:14)
        at visitSymbol (<redacted>\.vscode\extensions\ms-vscode.vscode-typescript-next-6.0.20250909\node_modules\typescript\lib\typescript.js:49811:17)
        at visitObjectType (<redacted>\.vscode\extensions\ms-vscode.vscode-typescript-next-6.0.20250909\node_modules\typescript\lib\typescript.js:49796:9)
        at visitType (<redacted>\.vscode\extensions\ms-vscode.vscode-typescript-next-6.0.20250909\node_modules\typescript\lib\typescript.js:49725:11)
        [...]
        at visitSymbol (<redacted>\.vscode\extensions\ms-vscode.vscode-typescript-next-6.0.20250909\node_modules\typescript\lib\typescript.js:49812:7)
        at visitObjectType (<redacted>\.vscode\extensions\ms-vscode.vscode-typescript-next-6.0.20250909\node_modules\typescript\lib\typescript.js:49796:9)
        at visitType (<redacted>\.vscode\extensions\ms-vscode.vscode-typescript-next-6.0.20250909\node_modules\typescript\lib\typescript.js:49725:11)
        at n.create (<redacted>\AppData\Local\Programs\Microsoft VS Code\resources\app\extensions\typescript-language-features\dist\extension.js:2:357355)
        at y.dispatchResponse (<redacted>\AppData\Local\Programs\Microsoft VS Code\resources\app\extensions\typescript-language-features\dist\extension.js:2:30813)
        at y.dispatchMessage (<redacted>\AppData\Local\Programs\Microsoft VS Code\resources\app\extensions\typescript-language-features\dist\extension.js:2:29254)
        at ChildProcess.<anonymous> (<redacted>\AppData\Local\Programs\Microsoft VS Code\resources\app\extensions\typescript-language-features\dist\extension.js:2:28539)
        at ChildProcess.emit (node:events:518:28)
        at ChildProcess.emit (node:domain:489:12)
        at emit (node:internal/child_process:949:14)
        at processTicksAndRejections (node:internal/process/task_queues:91:21)
    

🙂 Expected behavior

  1. "Refactor..." menu:
  2. No error.

Additional information about the issue

The type ProblematicType might not make sense to you, but it's a simplified (made as simple as I was able to) example of a real type in the @types/oojs library where I posted the issue as well, see https://github.com/DefinitelyTyped/DefinitelyTyped/discussions/73718.

For some reason, in VS Code this error appears only when the class is generic and an out of scope entity is referenced in the selection:

  • If you remove the generic parameter from TestRefactoring, the error will be gone.
  • If you remove the document reference from createElement() and replace it with smth, the error will be gone.

Contributor guide