microsoft / microsoft/TypeScript
Performance regression for declaration emit of an oversized inferred type
Nobody has claimed this yet.
- Dominant language
- Go
- Stars
- 111k
- Forks
- 14.3k
- Avg merge
- 2d 4h
- Merged PRs (30d)
- 132
Description
π Search Terms
TS7056 memory, declaration emit OOM, "inferred type of this node exceeds the maximum length", DeepCloneNode serializedTypes, NodeBuilder declaration emit memory, typescript-go TS7056 RSS
π Version & Regression Information
- This is the behavior in every version I tried, and I reviewed the FAQ for entries about declaration emit and large inferred types
- Reproduced on 7.1.0-dev (
main,./built/local/tsc) vs TypeScript 6.0.3 (./node_modules/typescript/bin/tsc). Both report the same TS7056 and emit no.d.ts. The Go compiler uses ~6Γ the memory and is 5.8x slower.
ββββββββββββββββββββββββ¬βββββββββββ¬βββββββββ¬βββββββββββββββββββ
β version β peak RSS β wall β result β
ββββββββββββββββββββββββΌβββββββββββΌβββββββββΌβββββββββββββββββββ€
β 5.9.3 β 0.51 GB β 0.97 s β TS7056, no .d.ts β
ββββββββββββββββββββββββΌβββββββββββΌβββββββββΌβββββββββββββββββββ€
β 6.0.3 β 0.41 GB β 0.66 s β TS7056, no .d.ts β
ββββββββββββββββββββββββΌβββββββββββΌβββββββββΌβββββββββββββββββββ€
β 7.0.0-dev.20260707.2 β 2.38 GB β 3.68 s β TS7056, no .d.ts β
ββββββββββββββββββββββββΌβββββββββββΌβββββββββΌβββββββββββββββββββ€
β 7.0.1-rc β 2.25 GB β 3.51 s β TS7056, no .d.ts β
ββββββββββββββββββββββββΌβββββββββββΌβββββββββΌβββββββββββββββββββ€
β 7.0.2 β 2.25 GB β 3.49 s β TS7056, no .d.ts β
ββββββββββββββββββββββββΌβββββββββββΌβββββββββΌβββββββββββββββββββ€
β main 7.1.0-dev β 2.42 GB β 3.41 s β TS7056, no .d.ts β
ββββββββββββββββββββββββ΄βββββββββββ΄βββββββββ΄βββββββββββββββββββ
β― Playground Link
N/A
π» Code
let x0 = { v: 1 };
let x1 = { a: x0, b: x0, c: x0 };
let x2 = { a: x1, b: x1, c: x1 };
let x3 = { a: x2, b: x2, c: x2 };
let x4 = { a: x3, b: x3, c: x3 };
let x5 = { a: x4, b: x4, c: x4 };
let x6 = { a: x5, b: x5, c: x5 };
let x7 = { a: x6, b: x6, c: x6 };
let x8 = { a: x7, b: x7, c: x7 };
let x9 = { a: x8, b: x8, c: x8 };
let x10 = { a: x9, b: x9, c: x9 };
let x11 = { a: x10, b: x10, c: x10 };
let x12 = { a: x11, b: x11, c: x11 };
let x13 = { a: x12, b: x12, c: x12 };
export const y = x13;
/usr/bin/time -l tsc --declaration repro.ts
π Actual behavior
Both compilers:
repro.ts(15,14): error TS7056: The inferred type of this node exceeds the maximum length the compiler will serialize. An explicit type annotation is needed.
Measured on macOS with /usr/bin/time -l:
| compiler | peak RSS | wall |
|---|---|---|
Go tsc 7.1.0-dev |
2.48 GB | 3.5 s |
JS tsc 6.0.3 |
0.41 GB | 0.6 s |
In a limited environment, or with a larger repro, this will cause the process to OOM.
π Expected behavior
Go tsc should report the same TS7056 error without using extra memory and being slower.
Additional information about the issue
Disclosure: This memory issue was found with a differential memory harness (Go tsc vs JS tsc 6.0.3) and AI assistance (Kimi K3). Verified by hand against TypeScript 7.1.0-dev (main) and TypeScript 6.0.3.
Contributor guide
First steps
- Read the whole issue, then the project's contributing guide.
- Comment on the issue to say you are picking it up β it saves two people doing the same work.
- Fork the repository and make your change on a branch.
- Open a pull request that references the issue number.
Research direction
Start by running the supplied repro.ts with declaration emit and comparing Go tsc against the JavaScript compiler using the shown time command. Then inspect the declaration-emit path around NodeBuilder, serializedTypes, and DeepCloneNode. Done means the Go compiler still reports TS7056 while avoiding the reported extra memory use and slowdown.
Written by the indexing model from the issue text.
Assessment
- Tech stack
- go, typescript
- Domain
- compilers, performance
- Issue type
- Bug
- Difficulty
- 4/5
- Estimated time
- 3-5 days
- Activity status
- Active
- Clarity
- Mostly clear
- Newbie friendliness
- 48/100