resolveJsonModule în TypeScript

Permite importul fișierelor .json, cu tipuri deduse din conținutul lor.

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

Ce face resolveJsonModule

Cu resolveJsonModule, poți scrie import date from "./date.json". tsc citește fișierul și deduce tipul din conținut: date.oras este string, iar o proprietate care nu există dă eroare. Fișierul JSON este copiat și în outDir.

În modulele ES din Node.js (module: nodenext), importul unui JSON trebuie să aibă atributul with { type: "json" }, cerut și de Node.js; fără el apare eroarea TS1543. Cu commonjs, nu e nevoie de atribut, dar ai nevoie de esModuleInterop pentru importul implicit.

Implicit este false, dar devine true când module este node16/node18/node20/nodenext sau preserve. Nu funcționează cu moduleResolution: classic.

Parametri

Parametru Descriere
true Fișierele .json pot fi importate.
false Importul unui .json dă eroarea TS2732.

Exemple

Exemplul 1: Import de JSON cu nodenext

Tipul lui date.locuitori este dedus ca number. date.json este copiat în dist, iar programul generat rulează.

// package.json
{ "type": "module" }

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

// src/date.json
{ "oras": "Iași", "judet": "Iași", "locuitori": 271692 }

// src/index.ts
import date from "./date.json" with { type: "json" };

const n: number = date.locuitori;
console.log(`${date.oras}: ${n} locuitori`);
console.log(date.judet.toUpperCase());

Rezultat (tsc 5.9)

$ npx tsc && find dist -type f | sort
dist/date.json
dist/index.js

$ node dist/index.js
Iași: 271692 locuitori
IAȘI

Exemplul 2: Fără atribut și cu o proprietate inexistentă

Primul rezultat: commonjs, fără resolveJsonModule. Al doilea: nodenext, cu opțiunea, dar fără with { type: "json" } și cu o proprietate care nu există în fișier.

// date.json
{ "oras": "Iași" }

// index.ts
import date from "./date.json";
console.log(date.oras.length);
const x: string = date.populatie;

Rezultat (tsc 5.9)

$ npx tsc          # "module": "commonjs", fără resolveJsonModule
index.ts(1,18): error TS2732: Cannot find module './date.json'. Consider using '--resolveJsonModule' to import module with '.json' extension.

$ npx tsc          # "module": "nodenext", "resolveJsonModule": true
index.ts(1,18): error TS1543: Importing a JSON file into an ECMAScript module requires a 'type: "json"' import attribute when 'module' is set to 'NodeNext'.
index.ts(3,24): error TS2339: Property 'populatie' does not exist on type '{ oras: string; }'.

Greșeli frecvente

  • Să imporți un JSON foarte mare. tsc îi deduce tipul complet, ceea ce încetinește compilarea; citește-l la rulare cu readFile și JSON.parse.
  • Să crezi că tipul dedus validează fișierul la rulare. Dacă JSON-ul se schimbă după compilare, tipurile nu mai corespund.

Comenzi înrudite

  • module: Alege formatul de module din JavaScript-ul generat (ES modules, CommonJS) și regulile de import pe care le verifică tsc.
  • allowArbitraryExtensions: Permite importul fișierelor cu orice extensie (.css, .svg) dacă există un fișier de declarații de forma nume.d.css.ts.
  • esModuleInterop: Face importul implicit (import x from „pachet”) al modulelor CommonJS să funcționeze corect, la verificare și la rulare.