It also covers the TS 6.0 deprecation cleanup ahead of 7.0: dropping moduleResolution node/node10, setting verbatimModuleSyntax, strict + noUncheckedIndexedAccess, explicit types, and explicit rootDir now that 6.0 no longer infers it.
Out of scope: TypeScript language syntax and idioms belong to ts-language-patterns; framework configs that ship their own tsconfig base (Next.js/Astro/Vite plugin skills) and non-TS build tooling are not covered.
TypeScript Config (TS 6.0)
Agent Workflow (MANDATORY)
Before writing any tsconfig, spawn 3 agents in parallel, one Agent call each with a name:
- fuse-ai-pilot:explore-codebase - Detect runtime (Bun/Node/bundler), existing tsconfig,
package.jsontype - fuse-ai-pilot:research-expert - Confirm current flags on typescriptlang.org release notes + runtime docs
- mcp__context7__query-docs -
/microsoft/typescriptfor any flag whose behavior is unclear
After writing, run fuse-ai-pilot:sniper for validation.
Overview
There are exactly two supported config trajectories in 2026. Pick by runtime, never mix.
| Track | Runtime | module |
moduleResolution |
|---|---|---|---|
| Bundler | Bun, Vite, esbuild, webpack | Preserve |
bundler |
| Node | Pure Node.js (native type stripping) | nodenext |
nodenext |
Critical Rules
- Never
moduleResolution: node/node10- deprecated in 6.0, removed in 7.0. Usebundlerornodenext. - Always
verbatimModuleSyntax: true- both tracks. Forces explicitimport type, matches Node's type stripping. strict+noUncheckedIndexedAccess- strict is the 6.0 default; addnoUncheckedIndexedAccessexplicitly.- Set
typesexplicitly - 6.0 defaultstypesto[]. Add["node"],["bun"], etc. or you lose globals. - Set
rootDirwhen sources are nested - 6.0 defaultsrootDirto the tsconfig dir, no longer inferred.
Decision: which track?
Runs on Bun, or bundled by Vite/esbuild/webpack/Parcel?
→ Bundler track → references/bundler-track.md
Runs directly on `node file.ts` (type stripping), or emits .js for Node?
→ Node track → references/node-track.md
Migrating an existing 5.x config / seeing deprecation errors?
→ references/deprecations-6.md (do this first, then pick a track)
Reference Guide
Concepts
| Topic | Reference | When to Consult |
|---|---|---|
| Bundler track | bundler-track.md | Load when configuring a Bun or bundler (Vite/esbuild/webpack) project |
| Node track | node-track.md | Load when configuring a pure Node.js project with native type stripping |
| 6.0 deprecations | deprecations-6.md | Load when migrating from TS 5.x or fixing deprecation errors |
Templates
| Template | When to Use |
|---|---|
| tsconfig.bundler.md | Complete Bun/bundler tsconfig |
| tsconfig.node.md | Complete pure-Node tsconfig |
Quick Reference
Bundler / Bun
{
"compilerOptions": {
"module": "Preserve",
"moduleResolution": "bundler",
"verbatimModuleSyntax": true,
"allowImportingTsExtensions": true,
"noEmit": true,
"strict": true,
"noUncheckedIndexedAccess": true
}
}
Pure Node.js (native type stripping)
{
"compilerOptions": {
"module": "nodenext",
"rewriteRelativeImportExtensions": true,
"erasableSyntaxOnly": true,
"verbatimModuleSyntax": true,
"noEmit": true, // only if you never emit .js
"strict": true
}
}
Best Practices
DO
- Add
"ignoreDeprecations": "6.0"temporarily while migrating, then remove it before adopting TS 7.0 - Use subpath imports
"#/*": "./src/*"inpackage.jsonimports(supported undernodenextandbundler) - Fold any
baseUrlprefix into eachpathsentry (baseUrlis deprecated)
DON'T
- Mix
module: PreservewithmoduleResolution: nodenext(or vice-versa) - Set
esModuleInterop,allowSyntheticDefaultImports, oralwaysStricttofalse(no longer allowed) - Use
enum,namespacewith runtime code, or parameter properties in files run by Node's type stripping