typescript-v6
TypeScript 6+ guidance for project development, tsconfig configuration, diagnostics, module resolution, deprecations, and modern standard-library typings. Use when building or maintaining TypeScript 6+ projects, debugging compiler behavior, or working through TS 6-specific defaults and tooling such as `#/` subpath imports, `ignoreDeprecations`, `RegExp.escape`, `Temporal`, and `--stableTypeOrdering`. Triggers on typescript 6, ts 6, stableTypeOrdering, ignoreDeprecations, types array, noUncheckedSideEffectImports, baseUrl deprecated, moduleResolution node deprecated, and subpath imports.
Works with
---
name: typescript-v6
description: TypeScript 6+ guidance for project development, tsconfig configuration, diagnostics, module resolution, deprecations, and modern standard-library typings. Use when building or maintaining TypeScript 6+ projects, debugging compiler behavior, or working through TS 6-specific defaults and tooling such as `#/` subpath imports, `ignoreDeprecations`, `RegExp.escape`, `Temporal`, and `--stableTypeOrdering`. Triggers on typescript 6, ts 6, stableTypeOrdering, ignoreDeprecations, types array, noUncheckedSideEffectImports, baseUrl deprecated, moduleResolution node deprecated, and subpath imports.
license: MIT
---
# TypeScript 6 Skill
> Build, configure, and debug TypeScript 6+ projects with precise compiler guidance and modern module/runtime patterns.
## Before You Start
**This skill is for real TypeScript 6+ project work: daily development, configuration, debugging, and upgrades.**
| Metric | Without Skill | With Skill |
|--------|--------------|------------|
| Upgrade Investigation Time | ~90 min | ~30 min |
| Common tsconfig Regressions | 5+ | 0-1 |
| Token Usage | High (manual diffing) | Low (release-note-grounded guidance) |
### Known Issues This Skill Prevents
1. Surprise build failures from missing `types` entries after upgrading
2. Unexpected `dist/src/...` output because `rootDir` was never explicit
3. Deprecated `moduleResolution node` or `baseUrl` settings surviving into a TS 6 migration
4. Confusion about when to use `bundler` vs `nodenext`
5. Overusing `ignoreDeprecations: "6.0"` as a long-term fix instead of a temporary migration aid
6. Misunderstanding `--stableTypeOrdering` as a production performance flag instead of a TS 6→7 comparison tool
7. Missing Node/test globals because TS 6+ projects often need explicit `types` entries
8. New side-effect import errors because TS 6 applies stricter side-effect import checking
## Quick Start
### Step 1: Make the important options explicit
```json
{
"compilerOptions": {
"rootDir": "./src",
"outDir": "./dist",
"types": ["node"],
"strict": true
},
"include": ["src/**/*"]
}
```
**Why this matters:** TypeScript 6 changed enough defaults and behaviors that explicit configuration now matters more in everyday work. `rootDir` and `types` are two of the most important settings to keep intentional.
### Step 2: Pick module resolution deliberately
```json
{
"compilerOptions": {
"module": "esnext",
"moduleResolution": "bundler"
}
}
```
**Why this matters:** TypeScript 6 deprecates `moduleResolution: "node"`/`"node10"`. Bundled apps should usually choose `bundler`, while Node.js packages should usually choose `nodenext`.
### Step 3: Use TS 6-era library typings only when the target/lib/runtime really supports them
```ts
const escaped = RegExp.escape('(hello)');
const value = new Map<string, number>().getOrInsert('count', 0);
const tomorrow = Temporal.Now.instant().add({ hours: 24 });
```
**Why this matters:** TypeScript 6 can type new platform APIs before every runtime ships them. Distinguish **compiler types available** from **runtime support available**.
### Step 4: Verify config and resolution before changing code
```bash
npx tsc --noEmit
npx tsc --showConfig
npx tsc --explainFiles
```
**Why this matters:** TS 6+ projects often fail because the effective config or included file graph is not what the project expects. Validate that first, then refactor.
## Critical Rules
### Always Do
- Make `rootDir` explicit when your sources are nested below the `tsconfig.json`
- Make the `types` array explicit for Node, test runners, Workers, Bun, or other global type providers when the project relies on those ambient globals
- Prefer `moduleResolution: "bundler"` for bundled web apps and `moduleResolution: "nodenext"` for modern Node.js packages
- Treat `ignoreDeprecations: "6.0"` as a short-term migration escape hatch, not the destination
- Use `paths` directly instead of relying on deprecated `baseUrl`
- Make `types` explicit when the project truly depends on Node, test, Worker, or Bun globals
- Treat side-effect imports as intentionally checked and fix their paths deliberately
- Verify runtime support before recommending `Temporal`, `getOrInsert`, or `RegExp.escape`
- Use `--stableTypeOrdering` only when comparing TS 6 and TS 7 behavior or investigating ordering-sensitive issues
- Use `satisfies`, exhaustive `never` checks, and assertion functions when TS 6+ code exposes type ambiguity that should be made explicit
- Re-run `tsc --noEmit` after config changes and again after type-pattern refactors
### Never Do
- Never recommend deprecated `moduleResolution: "node"` / `"node10"` as the forward-looking path
- Never recommend removed `moduleResolution: "classic"` as a fallback path
- Never leave `types` implicit if a project depends on `@types/node`, test globals, or platform globals
- Never assume `ignoreDeprecations: "6.0"` will keep working in TypeScript 7
- Never present TS 7 preview context as if it were already the default compiler runtime
- Never imply that TypeScript types guarantee runtime availability for new ECMAScript APIs
- Never import pre-TS 6 tsconfig advice that still uses `skipDefaultLibCheck`, `downlevelIteration`, or old AMD/UMD/SystemJS examples
### Common Mistakes
**Wrong - relying on pre-TS 6 ambient type loading:**
```json
{
"compilerOptions": {
"outDir": "./dist"
}
}
```
**Correct - declare what global types the project actually needs:**
```json
{
"compilerOptions": {
"outDir": "./dist",
"types": ["node"]
}
}
```
**Why:** In TS 6+, explicit `types` improves performance and predictability when the project depends on ambient globals.
**Wrong - keep deprecated path alias setup unchanged:**
```json
{
"compilerOptions": {
"baseUrl": "./src",
"paths": {
"@app/*": ["app/*"]
}
}
}
```
**Correct - inline the source prefix in `paths`:**
```json
{
"compilerOptions": {
"paths": {
"@app/*": ["./src/app/*"]
}
}
}
```
**Why:** `baseUrl` is deprecated in TS 6. The forward-looking setup is direct `paths` entries.
**Wrong - type widening hides the real config contract:**
```ts
const compilerMode = {
moduleResolution: 'bundler',
strict: true,
};
```
**Correct - keep literals checked without widening:**
```ts
const compilerMode = {
moduleResolution: 'bundler',
strict: true,
} satisfies {
moduleResolution: 'bundler' | 'nodenext';
strict: boolean;
};
```
**Why:** `satisfies` is not new in TS 6, but it is one of the cleanest ways to make config and option objects precise without losing inference.
**Wrong - union handling silently misses a new case:**
```ts
type ResolutionMode = 'bundler' | 'nodenext' | 'preserve';
function describeMode(mode: ResolutionMode) {
if (mode === 'bundler') return 'bundled app';
return 'node-style runtime';
}
```
**Correct - exhaustive union handling:**
```ts
type ResolutionMode = 'bundler' | 'nodenext' | 'preserve';
function describeMode(mode: ResolutionMode) {
switch (mode) {
case 'bundler':
return 'bundled app';
case 'nodenext':
return 'node-style runtime';
case 'preserve':
return 'mixed emit strategy';
default: {
const exhaustive: never = mode;
return exhaustive;
}
}
}
```
**Why:** TypeScript 6+ projects often rely on unions for config, platform, and runtime state. Exhaustive `never` checks make missing cases obvious.
**Wrong - use `stableTypeOrdering` as a normal build flag:**
```bash
tsc --stableTypeOrdering --build
```
**Correct - use it only for comparison/debugging:**
```bash
tsc --noEmit --stableTypeOrdering
```
**Why:** The flag exists to reduce TS 6 vs TS 7 output noise. It can meaningfully slow type-checking and is not intended as a permanent default.
## Known Issues Prevention
| Issue | Root Cause | Solution |
|-------|-----------|----------|
| `process` / `describe` / `fs` suddenly missing | The project relied on ambient type discovery that is no longer safe to assume during TS 6 migration work | Add explicit entries like `"types": ["node", "jest"]` |
| Output moves to `dist/src/...` | The project relied on inferred source-root behavior that TS 6 migration work often needs to replace with explicit config | Set `rootDir` explicitly, usually `./src` |
| Upgrade warnings explode | Deprecated module resolution or emit-era options survived from older configs | Migrate to `bundler` or `nodenext`; remove deprecated options |
| Side-effect imports suddenly error | Side-effect import checking is stricter in TS 6+ projects | Fix typos, add explicit files, or tighten import paths intentionally |
| `#/` imports do not resolve | Runtime or resolution mode does not match TS 6 support requirements | Use Node 20+ support with `moduleResolution: "bundler"` or `"nodenext"` |
| New ES APIs compile but fail at runtime | TS lib types are present, runtime support is not | Verify runtime compatibility and polyfill strategy separately |
| Type ordering changes create noisy diffs | TS 6/TS 7 ordering differs during migration experiments | Use `--stableTypeOrdering` temporarily |
## Bundled Resources
### References
- **Dedicated TS 6 migration guide** → [`references/migration-v6-reference.md`](references/migration-v6-reference.md)
- **Defaults and configuration behavior** → [`references/defaults-migration-reference.md`](references/defaults-migration-reference.md)
- **Deprecations and replacements** → [`references/deprecations-reference.md`](references/deprecations-reference.md)
- **Module resolution and `#/` imports** → [`references/module-resolution-imports-reference.md`](references/module-resolution-imports-reference.md)
- **New library types and APIs** → [`references/stdlib-types-reference.md`](references/stdlib-types-reference.md)
- **Verification workflow and diagnostics** → [`references/workflow-diagnostics-reference.md`](references/workflow-diagnostics-reference.md)
- **Type-safe patterns for TS 6+ code** → [`references/type-patterns-reference.md`](references/type-patterns-reference.md)
- **`stableTypeOrdering` and TS 7 context** → [`references/stable-ordering-ts7-reference.md`](references/stable-ordering-ts7-reference.md)
- **Reference index** → [`references/README.md`](references/README.md)
## Configuration Reference
### Bundled application baseline
```json
{
"compilerOptions": {
"target": "es2025",
"module": "esnext",
"moduleResolution": "bundler",
"lib": ["es2025", "dom"],
"rootDir": "./src",
"outDir": "./dist",
"strict": true,
"noUncheckedSideEffectImports": true
},
"include": ["src/**/*"]
}
```
**Key settings:**
- `rootDir`: Prevents accidental `dist/src/...` nesting
- `types`: Add it explicitly only when the project actually depends on Node/test/platform globals
- `moduleResolution: "bundler"`: Best fit for Vite/esbuild/Rollup/Webpack-style app builds
- `target: "es2025"` / `lib: ["es2025", ...]`: Gives access to TS 6-era built-in types such as `RegExp.escape`
### Node package baseline
```json
{
"compilerOptions": {
"target": "es2022",
"module": "nodenext",
"moduleResolution": "nodenext",
"lib": ["es2022"],
"rootDir": "./src",
"outDir": "./dist",
"types": ["node"],
"strict": true
},
"include": ["src/**/*"]
}
```
**Key settings:**
- `nodenext`: Use when the package's runtime semantics should follow modern Node.js ESM/CJS rules
- Explicit `.js` import specifiers and `package.json` module settings still matter; TS 6 does not remove that responsibility
## Project Structure
```
my-ts-project/
├── src/
├── dist/
├── package.json
└── tsconfig.json
```
**Why this matters:** TS 6 rewards explicit, boring project structure. Most upgrade pain comes from old implicit config behavior, not from source code syntax.
## Common Patterns
### Direct `paths` migration
```json
{
"compilerOptions": {
"paths": {
"@/*": ["./src/*"]
}
}
}
```
Use this instead of keeping deprecated `baseUrl` around.
### `#/` subpath imports for package-internal aliases
```json
{
"name": "my-package",
"type": "module",
"imports": {
"#/*": "./dist/*"
}
}
```
```ts
import * as utils from '#/utils.js';
```
Use this when your package/runtime already supports Node's `imports` field and you want package-native aliases instead of bundler-only conventions. Keep the exact mapping aligned with the files the package actually ships.
### Temporary migration shield
```json
{
"compilerOptions": {
"ignoreDeprecations": "6.0"
}
}
```
Use this only long enough to unblock the migration. Plan to remove it before TS 7.
### Monorepo/project-reference check
```json
{
"compilerOptions": {
"composite": true,
"declaration": true,
"isolatedDeclarations": true,
"rootDir": "./src",
"outDir": "./dist"
}
}
```
Use this when packages emit `.d.ts` files or participate in project references. `isolatedDeclarations` is not TS 6-exclusive, but it fits the stricter, more explicit TS 6+ workflow well.
## Verification Workflow
```bash
npx tsc --noEmit
npx tsc --showConfig
npx tsc --explainFiles
npx tsc --traceResolution
```
**When to use each command:**
- `--noEmit`: First-pass health check after config or type changes
- `--showConfig`: Confirm the effective merged config before debugging phantom settings
- `--explainFiles`: Understand why a file is in the program or why a file graph changed
- `--traceResolution`: Debug `paths`, package exports, `types`, or `#/` import resolution
## Troubleshooting
### "Cannot find name 'process'" / "Cannot find name 'describe'"
Add the appropriate `types` entries and install the matching `@types/*` package if needed.
### Output path changed unexpectedly
Set `rootDir` explicitly. This is one of the most common TS 6 upgrade regressions.
### Deprecated option warnings keep appearing
Migrate away from deprecated settings; use `ignoreDeprecations: "6.0"` only while the real replacement work is still in progress.
### New side-effect import errors appear in TS 6+
Inspect the import path and whether the file is intended as a side-effect-only module. TS 6 applies stricter checking here, so old typos or vague side-effect imports can surface now.
### `RegExp.escape` / `Temporal` / `getOrInsert` compile but fail in production
Check runtime support. TS 6 can expose types before every target environment implements the runtime API.
## Setup Checklist
- [ ] `rootDir` is explicit if source files live below the `tsconfig.json`
- [ ] `types` is explicit for Node, tests, Workers, Bun, or other ambient platforms
- [ ] `moduleResolution` is `bundler` or `nodenext`, not deprecated `node` / `node10`
- [ ] Removed `classic` resolution, `skipDefaultLibCheck`, and `downlevelIteration` are not lingering in copied config
- [ ] Deprecated `baseUrl` / `downlevelIteration` / ES5-era settings are removed or scheduled for removal
- [ ] `tsc --showConfig` and `tsc --explainFiles` were used if the upgrade behavior is still surprising
- [ ] `ignoreDeprecations: "6.0"` is temporary and tracked
- [ ] New TS 6 APIs are validated against actual runtime support
- [ ] `--stableTypeOrdering` is only used for migration comparisons, not normal builds
## Official Documentation
- [TypeScript 6.0 Release Notes](https://www.typescriptlang.org/docs/handbook/release-notes/typescript-6-0.html)
- [TypeScript Handbook](https://www.typescriptlang.org/docs/)
- [TSConfig Reference](https://www.typescriptlang.org/tsconfig/)
- [Compiler Options Reference](https://www.typescriptlang.org/docs/handbook/compiler-options.html)
- [Choosing Compiler Options](https://www.typescriptlang.org/docs/handbook/modules/guides/choosing-compiler-options.html)More Debugging skills
diagnosing-bugs
mattpocock/skills
Diagnosis loop for hard bugs and performance regressions. Use when the user says "diagnose"/"debug this", or reports something broken/throwing/failing/slow.
explore-code
lllllllama/rigorpilot-skills
Rigor Improve implementation leaf skill for auditable candidate implementation in deep learning research repositories. Use when the researcher explicitly authorizes exploratory work on an isolated branch or worktree to transplant modules, adapt a backbone, add LoRA or adapter layers, replace a head, or stitch together meaningful low-risk migration ideas with rollback-aware records in `explore_outputs/`. Do not use for end-to-end exploration orchestration on top of `current_research`, trusted baseline reproduction, conservative debugging, environment setup, verified contribution claims, or default repository analysis.
safe-debug
lllllllama/rigorpilot-skills
Rigor Debug / Rigor Audit skill for deep learning research work. Use when the user pastes a traceback, terminal error, CUDA OOM, checkpoint load failure, shape mismatch, NaN loss symptom, or training failure and wants conservative diagnosis before any patching, with debug fixes clearly separated from research contributions. Do not use for broad refactoring, speculative adaptation, automatic exploratory patching, or general repository familiarization.

