isolatedModules în TypeScript

Dă eroare pentru codul care nu poate fi transformat corect fișier cu fișier (de esbuild, Babel, swc sau Node.js).

Sintaxă
"compilerOptions": { "isolatedModules": true }

Ce face isolatedModules

Multe unelte transformă TypeScript în JavaScript un fișier o dată, fără să știe ce conțin celelalte fișiere: esbuild, Babel, swc, Vite, Node.js. Unele construcții nu pot fi transformate corect așa. Exemplul tipic: export { Produs } from "./tipuri.js", unde Produs este un tip. Privind doar acest fișier, unealta nu știe dacă trebuie să păstreze exportul (pentru o valoare) sau să-l șteargă (pentru un tip).

Cu isolatedModules, tsc dă eroare pentru aceste cazuri: reexportul unui tip fără export type (TS1205) și folosirea unui const enum declarat în altă parte (TS2748). Codul tău devine sigur pentru orice unealtă.

Implicit: false. Este pornită automat de verbatimModuleSyntax, iar tsc --init din 5.9 o scrie explicit. Dacă proiectul este compilat de altă unealtă decât tsc, pornește-o.

Parametri

Parametru Descriere
true Construcțiile care cer informații din alte fișiere dau eroare.
false Valoarea implicită.

Exemple

Exemplul 1: Reexport de tip și const enum ambiental

Produs este o interfață, deci reexportul cere export type. declare const enum nu are cod la rulare, iar o unealtă care vede doar acest fișier nu poate înlocui Culoare.Rosu cu valoarea lui.

// tsconfig.json
{
  "compilerOptions": {
    "isolatedModules": true,
    "module": "nodenext",
    "noEmit": true
  }
}

// tipuri.ts
export interface Produs {
  nume: string;
  pret: number;
}

export const MONEDA = "lei";

// index.ts
export { Produs, MONEDA } from "./tipuri.js";

declare const enum Culoare { Rosu, Verde }
console.log(Culoare.Rosu);

Rezultat (tsc 5.9)

$ npx tsc
index.ts(1,10): error TS1205: Re-exporting a type when 'isolatedModules' is enabled requires using 'export type'.
index.ts(4,13): error TS2748: Cannot access ambient const enums when 'isolatedModules' is enabled.

Exemplul 2: Varianta corectă

Tipul este marcat cu type, deci orice unealtă știe că trebuie șters. Codul rulează identic.

interface Produs {
  nume: string;
  pret: number;
}
export type { Produs };

export const MONEDA = "lei";

const p: Produs = { nume: "caiet", pret: 7.5 };
console.log(`${p.nume}: ${p.pret} ${MONEDA}`);

Rezultat

caiet: 7.5 lei

Greșeli frecvente

  • Să compilezi cu esbuild/Vite fără isolatedModules și să ai erori ciudate la rulare (does not provide an export named). tsc ar fi prins cazul cu opțiunea pornită.

Comenzi înrudite

  • verbatimModuleSyntax: Importurile rămân exact cum sunt scrise; se șterg doar cele marcate cu type, deci tipurile trebuie importate cu import type.
  • isolatedDeclarations: Cere tipuri scrise explicit pe exporturi, ca fișierele .d.ts să poată fi generate fișier cu fișier, fără verificarea tipurilor.
  • erasableSyntaxOnly: Interzice construcțiile TypeScript care generează cod (enum, namespace, parametri-proprietate), ca Node.js să poată rula direct fișierele .ts.
  • preserveConstEnums: Păstrează în JavaScript obiectul unui const enum; folosirile lui sunt tot înlocuite cu valorile.