resolvePackageJsonExports în TypeScript

Folosește câmpurile exports și imports din package.json la rezolvarea importurilor de pachete și a celor cu #.

Sintaxă
"compilerOptions": {
  "resolvePackageJsonExports": true,
  "resolvePackageJsonImports": true
}

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.