microsoft / microsoft/TypeScript
tsc not respecting types/typeRoots config for imported modules
Nobody has claimed this yet.
- Dominant language
- Go
- Stars
- 111k
- Forks
- 14.3k
- Avg merge
- 2d 4h
- Merged PRs (30d)
- 132
Description
Bug Report
Codebase is pulling in type declarations from the parent ../node_modules/@types/ folder, despite attempting to restrict the types and typeRoots to ignore it.
client/
node_modules/@types/foo/ # server shouldn't ever see this!
tsconfig.json
server/
node_modules/foo/ # server should see this as a module with no type declarations
tsconfig.json
🔎 Search Terms
- Stop typescript from including types from parent node_modules
- Prevent typeRoots from using parent node_modules
Related Issues:
- How to block typescript 2.0 from walking up all parent directories while resolving modules? #13992
- Declarations are unexpectedly used from node_modules in parent directory #30124
The issue is very similar to the ones described above, but neither were resolved beyond saying that unwanted types could be excluded with "types": []. This only seems to work for excluding global types (e.g. @types/node) as far as I can tell, there is no way to prevent typescript pulling in types for a module that is explicitly imported. See repro for more context.
🕗 Version & Regression Information
We are seeing this problem with typescript@3.9.9, but I have created a reproduction that also confirms it on typescript@latest and typescript@next too.
- This is the behavior in every version I tried, and I reviewed the FAQ for entries about excluding types and type roots.
💻 Code
Reproduced in repo with CI demonstrating incorrect behaviour here: https://github.com/danprince/typeroots-bug-repro
🙁 Actual behavior
The server codebase ends up including ../node_modules/@types/foo/index.d.ts as part of the compilation (through an import foo from "foo") even with "typeRoots": ["./node_modules/@types"] and "types": [].
Our current workaround is to remove the parent node_modules as part of our CI step.
We could also work around this by shadowing the declarations in the local node_modules/@types dir, or using paths hack to point typescript towards a non-existent version of the module, but it shouldn't be that hard.
All I want is to tell tsc is to never ever look in ../node_modules/@types.
🙂 Expected behavior
Never look in ../node_modules/@types for anything. I know that conflicts with the "moduleResolution": "node" to some degree, but it should be possible to configure that as far as type declarations are concerned.
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 with the linked typeroots-bug-repro and its server and client tsconfig.json files, then run the reported tsc compilation to observe parent node_modules/@types resolution. Trace how moduleResolution interacts with typeRoots, types, and an explicit import of foo. Done means a supported configuration prevents the parent declarations from being selected while preserving the intended module resolution behavior.
Written by the indexing model from the issue text.
Assessment
- Tech stack
- typescript
- Domain
- compilers
- Issue type
- Bug
- Difficulty
- 5/5
- Estimated time
- Over a week
- Activity status
- Stale
- Clarity
- Mostly clear
- Newbie friendliness
- 25/100