microsoft / microsoft/TypeScript

Identical resolved program produces 157 vs 662,155 diagnostics depending on whether the tsconfig is passed directly or through a pass-through extends

Open
#63,854 1 comment 0 reactions 0 assignees View on GitHub
Needs More Info
Dominant language
Go
Stars
111k
Forks
14.3k
Avg merge
2d 4h
Merged PRs (30d)
132

Description

On a large private monorepo package (~12k source files, React + Radix polymorphic component library), `tsgo --noEmit -p tsconfig.typecheck.json --pretty false` produces a stable 157 diagnostics. Creating a second config file in the SAME directory whose entire content is:

```json
{ "extends": "./tsconfig.typecheck.json" }
```

and running `--noEmit -p tsconfig.passthrough.json --pretty false` produces **662,155** diagnostics - 661,006 of them TS2859 "Excessive complexity comparing types" on comparisons as trivial as:

```
error TS2859: Excessive complexity comparing types '"confidential"' and
'"confidential" | "cui" | "internal" | "public" | "restricted" | "secret"'.
```

`--showConfig` for both invocations reports identical compilerOptions and an identical 8,743-file program (the only textual difference is path display relative to each config's location). Both results are stable across repeated runs - deterministic divergence keyed by config indirection, not flakiness.

Additional data points from the same program:

- A third shape - `extends` plus an explicitly enumerated `include` list that resolves to the same file set - produces a THIRD stable result (152 diagnostics), which additionally DROPS 5 real TS2353 errors that the direct run reports.
- Reproduced on `@typescript/native-preview 7.0.0-dev.20260707.2` (there the direct run was the clean-ish one) AND on stable `typescript@7.0.2` (there the DIRECT run explodes to the same 662,155).
- Composition-sensitivity at scale: growing the include set toward the full program flips diagnostic totals between 152 / 645,161 / 648,896 depending on which include units are present; the minimal trigger for the phantom `... is not assignable to type 'never'` class on polymorphic `as`-prop components (`const Component = as || Primitive.div`) is including the package's whole-fleet root barrel.
- tsc 5.9.3 cannot referee whole-program on this package (it dies at the V8 relation-cache Map cap - the motivating case for the native port); bounded subsets of the same files are green under tsc 5.9.3, 6.0.3, preview tsgo, and 7.0.2 alike.

Likely related ("Type Ordering"): microsoft/typescript-go#1605, microsoft/typescript-go#2830, microsoft/typescript-go#1278.

The repo is private, so this report ships observations rather than a runnable repro; happy to run instrumented builds or provide `--listFiles`/`--showConfig`/raw diagnostic captures for the A/B pair on request.

**Repro shape (for any large program):**

```bash
tsc-or-tsgo --noEmit -p tsconfig.json --pretty false | wc -l
printf '{ "extends": "./tsconfig.json" }\n' > tsconfig.passthrough.json
tsc-or-tsgo --noEmit -p tsconfig.passthrough.json --pretty false | wc -l
```

Contributor guide

Open the contributing guide

Research direction

Start with the reported tsconfig.typecheck.json and tsconfig.passthrough.json A/B runs, comparing --showConfig, --listFiles, and raw diagnostics for the direct and pass-through configurations. Check the explicitly enumerated include variant and the related Type Ordering issues #1605, #2830, and #1278. Done means identifying and fixing the configuration-dependent diagnostic divergence while preserving the same program and expected diagnostics.

Written by the indexing model from the issue text.

Assessment

Tech stack
go, react, typescript
Domain
compilers
Issue type
Bug
Difficulty
5/5
Estimated time
Over a week
Activity status
Quiet
Clarity
Mostly clear
Newbie friendliness
35/100

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.