Using TypeScript 7
TypeScript 7.0 ships a native tsc, but it does not ship the JavaScript compiler API that ts-jest needs for transforms,
language-service diagnostics, source maps, hoisting, and custom AST transformers. Microsoft provides
@typescript/typescript6
for tools that still need that API and recommends installing it alongside TypeScript 7 with npm aliases.
Installation
Install the two compilers under separate package names:
npm install --save-dev '@typescript/native@npm:typescript@^7.0.2' 'typescript@npm:@typescript/typescript6@^6.0.2'
If npm reports ERESOLVE after replacing typescript with TypeScript 7 directly, do not bypass the peer dependency check
with --legacy-peer-deps. Use the aliases above instead: the native package does not provide the compiler API required by
ts-jest, while the typescript alias does.
The equivalent package.json configuration is:
{
"devDependencies": {
"@typescript/native": "npm:typescript@^7.0.2",
"typescript": "npm:@typescript/typescript6@^6.0.2"
}
}
With this layout:
npx tscruns the native TypeScript 7 compiler for project type-checking and builds.npx tsc6runs the TypeScript 6 compatibility compiler when you need to compare results.ts-jestimportstypescript, so it receives the supported TypeScript 6 JavaScript API.
Do not set the ts-jest compiler option to @typescript/native. TypeScript 7.0 has no compatible JavaScript API, and
ts-jest will stop early with an actionable configuration error if that package is loaded directly.
Why ts-jest uses the compatibility API
Calling TypeScript 7 internals or translating between its native protocol and the TypeScript 6 API would create an unstable
second compiler integration. It would also leave gaps in custom transformers and Program access. The side-by-side layout is
the upstream-supported transition path and keeps one established API on the Jest transform path.
Two alternatives were deliberately rejected:
- ts-jest does not silently fall back to
@typescript/typescript6whentypescriptresolves to TypeScript 7. ts-jest's public declarations import classic compiler types fromtypescript; a runtime-only fallback would make those declarations inconsistent with the package the user's type checker resolves. - ts-jest does not call unstable native APIs or combine TypeScript 7 diagnostics with TypeScript 6 transforms. TypeScript 7.0
has no stable programmatic API, and a dual-compiler path would not preserve the existing transformer and
Programcontract.
This has two practical tradeoffs:
- TypeScript 7's native performance applies to
tsc, not to transforms performed by ts-jest. Jest transform performance is the same as TypeScript 6. - TypeScript 7 should be the authoritative project type-check. Diagnostics produced during Jest transforms come from the
TypeScript 6 compatibility API and can differ from TypeScript 7. Run
npx tsc --noEmitseparately in local development and CI.
TypeScript 6 reports TS5107 for moduleResolution: Node10. ts-jest filters that diagnostic only when it supplied Node10 as
its own historical default. If your tsconfig explicitly selects Node10, TS5107 is preserved so that you can migrate the
project configuration. Other TypeScript deprecations are not suppressed.
Backward compatibility
Projects using TypeScript 4.3 through 6 continue to install typescript normally and require no configuration changes. The
typescript alias above exposes version 6, so it also satisfies ts-jest's existing TypeScript peer dependency. This avoids a
second runtime lookup or version-dependent transform path.
This integration should be reevaluated when TypeScript ships a stable programmatic API for the native compiler. Until then, the aliases keep the native compiler and ts-jest's compiler API responsibilities explicit and independently upgradeable.