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șiJSON.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.