Importuri Inline de Tip și Modulul verbatimModuleSyntax în TypeScript 5.0 în TypeScript

Module și declarații TypeScript 4.5+ & 5.0+

Ghid complet pentru Type-Only Imports și flag-ul verbatimModuleSyntax în TypeScript 5.0: diferențierea importurilor de valori de cele de tipuri și eliminarea sigură a dependențelor de compilare.

Sintaxă
import { type User, proceseazaUser } from './servicii'; import type * as Config from './config';

În dezvoltarea modernă cu bundlere rapide precum Vite, esbuild, SWC sau Babel, compilatoarele transpilează fiecare fișier în mod complet izolat (fără a analiza întregul arbore de tipuri al proiectului). Dacă importați o clasă sau o interfață folosită exclusiv ca tip, transpilatorul poate lăsa accidental o instrucțiune import în codul JavaScript final, provocând erori la runtime dacă fișierul respectiv nu conține exporturi reale de valori (side-effects eronate).

Importuri de tipuri clasice vs. Importuri Inline de tipuri
// 1. Import de tip complet la nivel de declarație (TypeScript 3.8+):
import type { OptiuniServer } from './config';

// 2. Importuri inline amestecate într-o singură linie (TypeScript 4.5+):
// Importăm funcția reală 'lanseazaServer' ca valoare, dar 'Configuratie' doar ca tip!
import { lanseazaServer, type Configuratie, type PortRetea } from './server';

export function pornesteApp(cfg: Configuratie) {
    lanseazaServer(cfg);
}

// În codul JavaScript compilat:
// import { lanseazaServer } from './server';
// -> 'Configuratie' și 'PortRetea' au fost complet șterse, fără reziduuri!

Standardul TypeScript 5.0: verbatimModuleSyntax

În TypeScript 5.0, opțiunea verbatimModuleSyntax a simplificat radical configurarea modulelor, înlocuind și unificând vechile flag-uri confuze: importsNotUsedAsValues, preserveValueImports și isolatedModules.

Regula impusă de verbatimModuleSyntax: true este simplă și predictibilă:

  • Orice import care nu folosește prefixul type este păstrat exact așa cum este scris în codul JavaScript generat.
  • Orice import marcat cu import type sau type Nume este garantat eliminat 100% din fișierul compilat.
  • Importurile pentru side-effects exclusiviste trebuie scrise explicit: import "./polyfills";.
Configurarea în tsconfig.json
{
  "compilerOptions": {
    "target": "ES2022",
    "module": "NodeNext",
    "moduleResolution": "NodeNext",
    // Standardul recomandat pentru toate proiectele moderne TypeScript 5+:
    "verbatimModuleSyntax": true
  }
}

Exporturi Inline de Tipuri (Export Type)

Aceeași regulă se aplică și la re-exportarea din fișiere index (barrel files):

export { serviciiCore, type InterfataServiciu } from './servicii';

Această tehnică permite bundler-ului să elimine complet fișierele care conțin doar tipuri prin mecanismul de Dead Code Elimination / Tree Shaking.