Ce face resolvePackageJsonExports
Câmpul exports din package.json spune ce poate fi importat dintr-un pachet: de exemplu doar "plati" și "plati/card". Orice alt fișier din pachet este „privat”, iar Node.js refuză importul (ERR_PACKAGE_PATH_NOT_EXPORTED). Cu resolvePackageJsonExports, tsc respectă aceeași regulă.
Câmpul imports din package.json-ul proiectului definește prescurtări care încep cu # (de exemplu "#calcul"). Spre deosebire de paths, le înțelege și Node.js. resolvePackageJsonImports le activează în tsc.
Ambele sunt true implicit când moduleResolution este node16, nodenext sau bundler, și false altfel. Rareori trebuie scrise explicit; cu alte valori ale lui moduleResolution, tsc refuză opțiunile (eroarea TS5098).
Parametri
| Parametru | Descriere |
|---|---|
true |
Câmpul (exports, respectiv imports) este folosit. |
false |
Câmpul este ignorat. |
Exemple
Exemplul 1: Un fișier pe care pachetul nu îl exportă
plati exportă doar . și ./card. Importul din intern/ este refuzat de tsc cu nodenext, la fel ca de Node.js la rulare. Cu vechiul node10 (care nu citește exports), tsc nu ar observa problema.
// node_modules/plati/package.json
{
"name": "plati",
"type": "module",
"exports": {
".": "./index.js",
"./card": "./card.js"
}
}
// index.ts (tsconfig: "module": "nodenext")
import { moneda } from "plati";
import { plataCard } from "plati/card";
import { cheie } from "plati/intern/cheie.js";
console.log(moneda, plataCard(50), cheie);
Rezultat (tsc 5.9)
$ npx tsc
index.ts(3,23): error TS2307: Cannot find module 'plati/intern/cheie.js' or its corresponding type declarations.
$ npx tsc --module commonjs --moduleResolution node10
$ node index.js 2>&1 | grep '^Error' # aceleași importuri, în JavaScript
Error [ERR_PACKAGE_PATH_NOT_EXPORTED]: Package subpath './intern/cheie.js' is not defined by "exports" in /proiect/node_modules/plati/package.json imported from /proiect/index.js
Exemplul 2: Prescurtări cu imports și #
"#calcul" este definit în package.json. tsc îl găsește (prin resolvePackageJsonImports), iar Node.js rulează fișierul generat fără altă configurare.
// package.json
{
"type": "module",
"imports": {
"#calcul": "./src/utile/calcul.js"
}
}
// tsconfig.json
{
"compilerOptions": {
"module": "nodenext",
"target": "es2022"
}
}
// src/utile/calcul.ts
export function cuTva(pret: number): number {
return Math.round(pret * 1.19 * 100) / 100;
}
// src/index.ts
import { cuTva } from "#calcul";
console.log(cuTva(100));
Rezultat (tsc 5.9)
$ npx tsc && node src/index.js
119
Greșeli frecvente
- Să importi fișiere interne ale unui pachet (
pachet/dist/intern.js). Chiar dacă merge cu setări vechi, se strică la prima versiune care adaugăexports.
Comenzi înrudite
customConditions: Condiții proprii folosite la citirea câmpului exports din package.json, pe lângă import, require, types și node.moduleResolution: Alege regulile după care tsc găsește fișierul din spatele unui import („./calcul.js”, „react”, „@/utile”).paths: Definește prescurtări pentru importuri (de exemplu „@/utile/calcul” pentru ./src/utile/calcul) folosite la verificarea tipurilor.module: Alege formatul de module din JavaScript-ul generat (ES modules, CommonJS) și regulile de import pe care le verifică tsc.