lib în TypeScript

Alege ce declarații de tipuri pentru mediul de rulare sunt incluse: versiunea JavaScript (es2022) și API-urile (dom, webworker).

Sintaxă
"compilerOptions": {
  "lib": ["es2022", "dom", "dom.iterable"]
}

Ce face lib

TypeScript nu știe singur ce funcții există la rulare. Le află din fișierele de declarații incluse cu el: lib.es2022.d.ts descrie Array.prototype.at, lib.dom.d.ts descrie document, window, fetch și console. Fără lib scris, lista vine din target plus dom (de exemplu target: es2022 înseamnă es2022 și dom).

Când scrii lib, înlocuiești complet lista. Pentru un program Node.js fără browser poți scrie ["es2022"], dar atunci console vine doar din @types/node (vezi exemplul). Valori: versiunile es5…es2024, esnext, dom, dom.iterable, dom.asynciterable, webworker, scripthost și părți mai mici, ca es2022.array sau esnext.disposable.

noLib (implicit false) nu include niciun fișier de bibliotecă; trebuie să definești tu tipurile de bază (Array, String…). libReplacement (TypeScript 5.8, implicit true) permite înlocuirea unei biblioteci cu un pachet npm numit @typescript/lib-* (de exemplu @typescript/lib-dom). tsc caută aceste pachete la fiecare compilare; dacă nu le folosești, "libReplacement": false evită căutarea.

Parametri

Parametru Descriere
lib: ["…"] Lista de biblioteci. Implicit: calculată din target, plus dom.
noLib: true Nicio bibliotecă standard.
libReplacement: false Nu caută pachete @typescript/lib-*. Implicit true.

Exemple

Exemplul 1: Fără dom

Fără dom și fără @types/node, nu există nici document, nici console.

// tsconfig.json
{
  "compilerOptions": {
    "target": "es2022",
    "lib": ["es2022"],
    "noEmit": true
  }
}

// index.ts
const buton = document.querySelector("button");
console.log(buton);

Rezultat (tsc 5.9)

$ npx tsc
index.ts(1,15): error TS2584: Cannot find name 'document'. Do you need to change your target library? Try changing the 'lib' compiler option to include 'dom'.
index.ts(2,1): error TS2584: Cannot find name 'console'. Do you need to change your target library? Try changing the 'lib' compiler option to include 'dom'.

Exemplul 2: noLib

Fără nicio bibliotecă, lipsesc chiar și tipurile de bază.

// index.ts
let x: number = 1;
console.log(x);

Rezultat (tsc 5.9)

$ npx tsc --noEmit --noLib index.ts
error TS2318: Cannot find global type 'Array'.
error TS2318: Cannot find global type 'Boolean'.
error TS2318: Cannot find global type 'Function'.
error TS2318: Cannot find global type 'IArguments'.
error TS2318: Cannot find global type 'Number'.
error TS2318: Cannot find global type 'Object'.
error TS2318: Cannot find global type 'RegExp'.
error TS2318: Cannot find global type 'String'.

Exemplul 3: O bibliotecă înlocuită de un pachet

În node_modules/@typescript/lib-es2022 există un pachet propriu care declară funcția globală afiseaza. Cu libReplacement (implicit), tsc îl folosește în locul lui lib.es2022.d.ts; cu false, folosește biblioteca standard și afiseaza nu există.

// tsconfig.json
{
  "compilerOptions": {
    "target": "es2022",
    "lib": ["es2022"],
    "noEmit": true
  }
}

// index.ts
afiseaza([1, 2].length);

Rezultat (tsc 5.9)

$ npx tsc --listFilesOnly
/proiect/node_modules/@typescript/lib-es2022/index.d.ts
/proiect/index.ts

$ npx tsc

$ npx tsc --libReplacement false
index.ts(1,1): error TS2304: Cannot find name 'afiseaza'.

Greșeli frecvente

  • Să scrii "lib": ["dom"] fără o versiune es…. Pierzi Promise, Map și restul; lista înlocuiește complet valoarea implicită.
  • Să adaugi "lib": ["esnext"] crezând că funcțiile noi vor exista la rulare. lib descrie doar ce presupui că există; mediul trebuie să le aibă.

Comenzi înrudite

  • target: Versiunea de JavaScript generată: sintaxa mai nouă decât ținta este transformată în cod echivalent mai vechi.
  • types: Alege exact ce pachete de tipuri globale (din node_modules/@types) se încarcă automat; [] nu încarcă niciunul.
  • skipLibCheck: Nu mai verifică erorile din fișierele .d.ts (ale pachetelor și ale proiectului); compilarea devine mai rapidă.
  • noResolve: Nu adaugă în compilare fișierele găsite prin import sau /// <reference>; intră doar fișierele date explicit.