Ce face customConditions
În exports, un pachet poate da fișiere diferite pentru condiții diferite: "import", "require", "types", "node", "browser" sau condiții inventate de el (de exemplu "dezvoltare"). Node.js activează o condiție proprie cu node --conditions=dezvoltare; bundlerele au setări asemănătoare.
customConditions îi spune lui tsc ce condiții proprii să considere active, ca tipurile să vină din același fișier pe care îl va folosi codul la rulare. Funcționează doar cu moduleResolution node16, nodenext sau bundler. Implicit: nicio condiție proprie.
Parametri
| Parametru | Descriere |
|---|---|
["conditie", ...] |
Condițiile proprii considerate active la rezolvare. |
Exemple
Exemplul 1: Varianta de dezvoltare a unui pachet
setari are două variante. Cu customConditions, tsc alege dev.d.ts; fără, alege varianta default și dă eroare. Node.js face aceeași alegere, în funcție de --conditions.
// node_modules/setari/package.json
{
"name": "setari",
"exports": {
".": {
"dezvoltare": "./dev.js",
"default": "./prod.js"
}
}
}
// dev.d.ts: export declare const mediu: "dezvoltare";
// prod.d.ts: export declare const mediu: "producție";
// tsconfig.json
{
"compilerOptions": {
"module": "preserve",
"moduleResolution": "bundler",
"customConditions": ["dezvoltare"],
"noEmit": true
}
}
// index.ts
import { mediu } from "setari";
const m: "dezvoltare" = mediu;
console.log(m);
Rezultat (tsc 5.9)
$ npx tsc
$ npx tsc --customConditions null
index.ts(3,7): error TS2322: Type '"producție"' is not assignable to type '"dezvoltare"'.
$ node --conditions=dezvoltare -e 'import("setari").then(m => console.log(m.mediu))'
dezvoltare
$ node -e 'import("setari").then(m => console.log(m.mediu))'
producție
Greșeli frecvente
- Să setezi condiția în tsconfig, dar nu și la rulare (Node.js, bundler). Tipurile vin dintr-o variantă, codul din alta.
Comenzi înrudite
resolvePackageJsonExports: Folosește câmpurile exports și imports din package.json la rezolvarea importurilor de pachete și a celor cu #.moduleResolution: Alege regulile după care tsc găsește fișierul din spatele unui import („./calcul.js”, „react”, „@/utile”).