SuperAPI AI Directory

ts-config

General & other

View repository

Updated 10-15 21:49

About this skill

It also covers the TS 6.0 deprecation cleanup that TS 7.0 (native Go compiler) enforces as hard errors: dropping moduleResolution node/node10, setting verbatimModuleSyntax, strict + noUncheckedIndexedAccess, explicit types, and explicit rootDir now that it is no longer inferred.

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 7.0)

Agent Workflow (MANDATORY)

Before writing any tsconfig, spawn 3 agents in parallel, one Agent call each with a name:

  1. fuse-ai-pilot:explore-codebase - Detect runtime (Bun/Node/bundler), existing tsconfig, package.json type
  2. fuse-ai-pilot:research-expert - Confirm current flags on typescriptlang.org release notes + runtime docs
  3. mcp__context7__query-docs - /microsoft/typescript for 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

  1. Never moduleResolution: node / node10 - deprecated in 6.0, hard error in 7.0. Use bundler or nodenext.
  2. Always verbatimModuleSyntax: true - both tracks. Forces explicit import type, matches Node's type stripping.
  3. strict + noUncheckedIndexedAccess - strict is the default since 6.0 (kept in 7.0); add noUncheckedIndexedAccess explicitly.
  4. Set types explicitly - since 6.0 (kept in 7.0) types defaults to []. Add ["node"], ["bun"], etc. or you lose globals.
  5. Set rootDir when sources are nested - since 6.0 (kept in 7.0) rootDir defaults to 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 / 7.0 errors deprecations-6.md Load when migrating from TS 5.x/6.0, fixing deprecation errors, or adopting the TS 7.0 tsc

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 on TS 6.0 while migrating, then remove it — TS 7.0 does not honour it (deprecated options are hard errors)
  • Keep tools that need the compiler API (e.g. typescript-eslint) on TS 6 via the @typescript/typescript6 alias while tsc runs TS 7.0 — see deprecations-6.md
  • Use subpath imports "#/*": "./src/*" in package.json imports (supported under nodenext and bundler)
  • Fold any baseUrl prefix into each paths entry (baseUrl is deprecated)

DON'T

  • Mix module: Preserve with moduleResolution: nodenext (or vice-versa)
  • Set esModuleInterop, allowSyntheticDefaultImports, or alwaysStrict to false (no longer allowed)
  • Use enum, namespace with runtime code, or parameter properties in files run by Node's type stripping