microsoft / microsoft/TypeScript

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

Aperta
#62,471 1 commento 0 reazioni 0 assegnatari Vedi su GitHub

Nessuno ha ancora preso questa issue.

Bug Domain: Indexed Access Types Help Wanted Needs Human Review
Lingua principale
Go
Stelle
111k
Fork
14.3k
Merge medio
2g 4h
PR unite (30g)
132

Descrizione

### 🔎 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:
```ts
function func(param: ProblematicType) {}

type ProblematicType = {
prop: ProblematicType;
};

class TestRefactoring {
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:
image
3. Extension Host logs in VS Code:
```
[error] [vscode.typescript-language-features] provider FAILED
[error] Error: TypeScript Server Error (6.0.0-dev.20250909)
Maximum call stack size exceeded
RangeError: Maximum call stack size exceeded
at instantiateType (\.vscode\extensions\ms-vscode.vscode-typescript-next-6.0.20250909\node_modules\typescript\lib\typescript.js:68177:27)
at instantiateTypeWorker (\.vscode\extensions\ms-vscode.vscode-typescript-next-6.0.20250909\node_modules\typescript\lib\typescript.js:68263:9)
at instantiateTypeWithAlias (\.vscode\extensions\ms-vscode.vscode-typescript-next-6.0.20250909\node_modules\typescript\lib\typescript.js:68210:20)
at instantiateType (\.vscode\extensions\ms-vscode.vscode-typescript-next-6.0.20250909\node_modules\typescript\lib\typescript.js:68178:29)
at getMappedType (\.vscode\extensions\ms-vscode.vscode-typescript-next-6.0.20250909\node_modules\typescript\lib\typescript.js:67858:67)
at \.vscode\extensions\ms-vscode.vscode-typescript-next-6.0.20250909\node_modules\typescript\lib\typescript.js:67987:56
at map (\.vscode\extensions\ms-vscode.vscode-typescript-next-6.0.20250909\node_modules\typescript\lib\typescript.js:2492:19)
at getObjectTypeInstantiation (\.vscode\extensions\ms-vscode.vscode-typescript-next-6.0.20250909\node_modules\typescript\lib\typescript.js:67987:29)
at instantiateTypeWorker (\.vscode\extensions\ms-vscode.vscode-typescript-next-6.0.20250909\node_modules\typescript\lib\typescript.js:68235:16)
at instantiateTypeWithAlias (\.vscode\extensions\ms-vscode.vscode-typescript-next-6.0.20250909\node_modules\typescript\lib\typescript.js:68210:20)
at instantiateType (\.vscode\extensions\ms-vscode.vscode-typescript-next-6.0.20250909\node_modules\typescript\lib\typescript.js:68178:29)
at getTypeOfInstantiatedSymbol (\.vscode\extensions\ms-vscode.vscode-typescript-next-6.0.20250909\node_modules\typescript\lib\typescript.js:61397:40)
at getTypeOfSymbol (\.vscode\extensions\ms-vscode.vscode-typescript-next-6.0.20250909\node_modules\typescript\lib\typescript.js:61461:14)
at visitSymbol (\.vscode\extensions\ms-vscode.vscode-typescript-next-6.0.20250909\node_modules\typescript\lib\typescript.js:49811:17)
at visitObjectType (\.vscode\extensions\ms-vscode.vscode-typescript-next-6.0.20250909\node_modules\typescript\lib\typescript.js:49796:9)
at visitType (\.vscode\extensions\ms-vscode.vscode-typescript-next-6.0.20250909\node_modules\typescript\lib\typescript.js:49725:11)
[...]
at visitSymbol (\.vscode\extensions\ms-vscode.vscode-typescript-next-6.0.20250909\node_modules\typescript\lib\typescript.js:49812:7)
at visitObjectType (\.vscode\extensions\ms-vscode.vscode-typescript-next-6.0.20250909\node_modules\typescript\lib\typescript.js:49796:9)
at visitType (\.vscode\extensions\ms-vscode.vscode-typescript-next-6.0.20250909\node_modules\typescript\lib\typescript.js:49725:11)
at n.create (\AppData\Local\Programs\Microsoft VS Code\resources\app\extensions\typescript-language-features\dist\extension.js:2:357355)
at y.dispatchResponse (\AppData\Local\Programs\Microsoft VS Code\resources\app\extensions\typescript-language-features\dist\extension.js:2:30813)
at y.dispatchMessage (\AppData\Local\Programs\Microsoft VS Code\resources\app\extensions\typescript-language-features\dist\extension.js:2:29254)
at ChildProcess. (\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:
image
3. 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.

Guida per i contributori

Apri la guida per i contributori

Come iniziare

  1. Leggi tutta la issue e poi la guida ai contributi del progetto.
  2. Commenta sulla issue per dire che te ne occupi tu — evita che due persone facciano lo stesso lavoro.
  3. Fai un fork del repository e lavora su un branch.
  4. Apri una pull request che faccia riferimento al numero della issue.

Direzione di ricerca

Inizia con la riproduzione minima in TypeScript e la richiesta di refactoring di TS Server descritte nell'issue. Usa lo stack riportato intorno a instantiateType, getMappedType, visitSymbol, visitObjectType e visitType per tracciare il percorso ricorsivo. Il lavoro è completato quando l'esempio non causa più un RangeError e il menu Refactor previsto è disponibile.

Scritto dal modello di indicizzazione a partire dal testo della issue.

Valutazione

Stack tecnologico
typescript
Ambito
tooling
Tipo di issue
Bug
Difficoltà
4/5
Tempo stimato
3-5 giorni
Stato di attività
Ferma
Chiarezza
Abbastanza chiara
Idoneità per principianti
35/100

Ricevi le nuove issue nella tua casella

Un breve riepilogo di issue GitHub adatte ai principianti.