emitDeclarationOnly în TypeScript

tsc scrie doar fișierele .d.ts, fără .js; JavaScript-ul este produs de altă unealtă (esbuild, Babel, swc).

Sintaxă
"compilerOptions": {
  "declaration": true,
  "emitDeclarationOnly": true
}

Ce face emitDeclarationOnly

În multe proiecte, JavaScript-ul este produs de o unealtă rapidă (esbuild, swc, Babel, Vite), care însă nu poate genera fișiere .d.ts. Cu emitDeclarationOnly, tsc face doar această parte: verifică tipurile și scrie .d.ts, fără niciun .js.

Are nevoie de declaration sau composite (altfel TS5069). Permite și allowImportingTsExtensions, pentru că nu se generează JavaScript. Implicit: false.

Parametri

Parametru Descriere
true Se scriu doar .d.ts (și .d.ts.map).
false Valoarea implicită.

Exemple

Exemplul 1: Doar declarații

Aceeași sursă ca la declaration, dar în dist apare doar magazin.d.ts. Fără declaration, tsc refuză opțiunea.

// tsconfig.json
{
  "compilerOptions": {
    "module": "nodenext",
    "target": "es2022",
    "declaration": true,
    "emitDeclarationOnly": true,
    "outDir": "dist"
  }
}

Rezultat (tsc 5.9)

$ npx tsc && find dist -type f | sort
dist/magazin.d.ts

$ npx tsc          # fără "declaration": true
tsconfig.json(5,5): error TS5069: Option 'emitDeclarationOnly' cannot be specified without specifying option 'declaration' or option 'composite'.

Greșeli frecvente

  • Să confunzi opțiunea cu noEmit. noEmit nu scrie nimic; emitDeclarationOnly scrie declarațiile.

Comenzi înrudite

  • declaration: Generează lângă fiecare fișier .js un fișier .d.ts cu tipurile lui, ca alte proiecte să-l poată folosi cu tipuri.
  • noEmit: tsc doar verifică tipurile și nu scrie niciun fișier (.js, .d.ts, .map).
  • 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.
  • declarationDir: Directorul în care se scriu fișierele .d.ts, separat de outDir unde ajunge JavaScript-ul.