Representative interview topic

Coding Interview: How Do You Safely Migrate to the TypeScript 7 Native Compiler?

CodingHard
Offer.cc Editorial TeamPublished Updated

Question

A TypeScript 6 monorepo has slow CI type-checking and tools that depend on the TypeScript API. How do you safely migrate to TypeScript 7?

Prompt and context

Your team maintains web applications and shared packages in a TypeScript 6 monorepo. CI type-checking is too slow, and the repository uses typescript-eslint, a webpack loader, and Vue and Angular template tooling. You must evaluate the TypeScript 7 native compiler.

Design a migration plan that keeps a TypeScript 6 compatibility layer, schedules CLI and editor upgrades, controls the memory risk of parallel checking, and defines canary, metrics, and rollback gates.

What the interviewer tests

  • Whether you distinguish tsc CLI, editor language services, and programmatic TypeScript API dependencies.
  • Whether pinned versions, two compilers, and comparable artifacts can reduce migration risk.
  • Whether parallelism, memory, diagnostic differences, and ecosystem compatibility become executable release gates.
  • Whether you can state the boundary created by TypeScript 7 not yet having a stable programmatic API.

Questions to clarify

  1. Does CI use tsc --build, an isolated project, or a custom compiler API?
  2. Which tools import typescript directly, and which only read declarations or CLI output?
  3. Is TypeScript 6 stableTypeOrdering enabled, with baselines for declarations, diagnostics, and build time?
  4. Are editor versions, the Node memory limit, and CI runner CPU/memory fixed?

30-second answer

I would inventory every TypeScript API consumer, then install the TypeScript 7 CLI beside the TypeScript 6 compatibility package with pinned versions and a lockfile. In CI I would compare declarations, diagnostics, generated JavaScript, source maps, tests, and resource usage; I would enable stableTypeOrdering on the TypeScript 6 side first. I would increase TypeScript 7 --checkers and --builders only from a baseline, keeping --singleThreaded as a diagnostic switch. Vue, MDX, Astro, Svelte, and Angular tools without a stable API path would remain on TypeScript 6. I would use canaries, staged editor rollout, and an explicit versioned rollback before widening adoption.

Step-by-step deep dive

Inventory compiler and API dependencies

Record Node, package manager, TypeScript, tsconfig, project references, loaders, plugins, and editor versions. Classify consumers as CLI, declaration/generated artifacts, language service, or programmatic API; programmatic API users need a separate compatibility check.

Install TypeScript 7 and TypeScript 6 side by side

TypeScript 7 currently provides the native compiler but not a stable API. Let tsc use 7 while an npm alias preserves tsc6:

json
{
  "devDependencies": {
    "@typescript/native": "npm:typescript@^7.0.2",
    "typescript": "npm:@typescript/typescript6@^6.0.2"
  }
}

Pin the versions that passed validation and commit the lockfile. Scripts should call each binary explicitly so package-manager flattening cannot silently select the wrong compiler.

Establish comparable artifact baselines

Enable TypeScript 6 stableTypeOrdering first, then save .d.ts, diagnostics, generated JavaScript, source maps, incremental caches, and test results. Separate ordering changes, real type errors, and tool formatting differences; only explainable, API-safe changes belong on the allowlist.

Tune checker and builder parallelism

TypeScript 7 uses four checker workers by default, and builders can also run in parallel. Measure on fixed CPU, memory, and project order before increasing parallelism. Record wall-clock time, peak RSS, GC, and retries; roll back when the runner memory budget is exceeded. Use --singleThreaded to reproduce nondeterminism and keep a fixed worker count in CI.

Isolate ecosystem tools and editor rollout

Do not force template tools to upgrade before a stable programmatic API exists. Vue, MDX, Astro, Svelte, and Angular tools may still depend on TypeScript 6 APIs, so let them consume tsc6 or keep a separate TS6 language service. Enable the matching editor extension for a small developer channel first and observe completion, navigation, diagnostics, and crash rates.

Canary, metrics, and rollback

Start with low-risk packages and one CI canary. Compare build time, diagnostic differences, declaration compatibility, peak memory, editor errors, and test pass rate. On failure, restore the old lockfile, scripts, and TS6 editor channel; removing only the TS7 package can leave a mismatched loader. Widen to other workspaces only after all gates pass repeatedly.

Model answer

The value of TypeScript 7 is a native compiler and faster CLI, but API consumers define the migration boundary. I would run a two-track plan: TS7 for CLI work and TS6 for compatibility. Pin both versions, expose tsc and tsc6, and route loaders, template tools, and editors according to their programmatic API dependency. First enable stableTypeOrdering and compare declarations, diagnostics, generated artifacts, source maps, tests, and resource use. Tune parallel settings against a fixed runner, using --singleThreaded for reproduction. Expand through canaries and staged editor adoption; any diagnostic regression, declaration break, memory overrun, or editor failure triggers rollback. Because TypeScript 7 has no stable programmatic API yet, keep TS6 until ecosystem tools complete their validation.

Common mistakes

  • Replacing the typescript version without checking loaders, plugins, and template tools that import its API.
  • Attributing every speedup to the native compiler without a repository baseline or memory budget.
  • Treating declaration ordering changes as type regressions without enabling stableTypeOrdering.
  • Maximizing CI parallelism while ignoring runner memory and retry behavior.
  • Assuming editor and programmatic API compatibility because the CLI runs.
  • Planning a verbal “uninstall TS7” rollback without preserving lockfiles, scripts, and editor versions.

Follow-up questions

If a loader depends on the TypeScript 6 API, can only CI upgrade?

Yes. Upgrade only a type-check canary first, keep the loader on tsc6 or the TypeScript 6 API, and verify generated artifacts and declarations before upgrading the loader.

Is a larger --checkers value always better?

No. CPU, memory, the project graph, and GC all matter. Choose with wall-clock time and peak RSS on a fixed runner, and keep a smaller value as a fallback.

When can TypeScript 6 be removed?

After every programmatic API consumer, template tool, editor, and build plugin passes compatibility validation and canary metrics stay within gates. Reassess the compatibility layer when TypeScript 7 has a stable API.

How do you prove type results did not change?

Compare diagnostics, declarations, generated JavaScript, source maps, and tests, classifying ordering and formatting differences. Exit-code equality alone is insufficient.

Public sources

Related questions

Related interview tool

Use Screenshot for a coding prompt

Capture the problem, then work through the constraints, solution, code, edge cases, and complexity in order.

View the tool