importHelpers în TypeScript

Ia funcțiile ajutătoare (__awaiter, __decorate...) din pachetul tslib, în loc să le copieze în fiecare fișier.

Sintaxă
"compilerOptions": {
  "importHelpers": true
}

npm install tslib

Ce face importHelpers

Când target este mai vechi decât sintaxa folosită (de exemplu async pentru ES2015), tsc adaugă în fișierul generat funcții ajutătoare: __awaiter, __classPrivateFieldGet, __decorate, __importDefault. Fiecare fișier primește propria copie, deci într-un proiect mare același cod apare de zeci de ori.

Cu importHelpers, tsc le importă din pachetul tslib (pe care îl instalezi ca dependență), o singură dată. Fără tslib instalat, apare eroarea TS2354. noEmitHelpers merge mai departe: nu scrie funcțiile și nici nu le importă, presupunând că le definești tu global. Ambele sunt implicit false.

Parametri

Parametru Descriere
importHelpers: true Funcțiile ajutătoare sunt importate din tslib.
noEmitHelpers: true Funcțiile ajutătoare nu sunt nici scrise, nici importate.

Exemple

Exemplul 1: Funcția ajutătoare copiată în fișier

Cu target: es2015, async nu există încă, deci tsc scrie __awaiter la începutul fișierului.

// tsconfig.json
{
  "compilerOptions": {
    "module": "commonjs",
    "target": "es2015"
  }
}

// index.ts
export async function citeste() {
  return 42;
}

Rezultat (tsc 5.9)

$ npx tsc && cat index.js
"use strict";
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
    function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
    return new (P || (P = Promise))(function (resolve, reject) {
        function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
        function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
        function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
        step((generator = generator.apply(thisArg, _arguments || [])).next());
    });
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.citeste = citeste;
function citeste() {
    return __awaiter(this, void 0, void 0, function* () {
        return 42;
    });
}

Exemplul 2: Cu importHelpers și tslib

Funcția vine acum din tslib. Fără pachetul instalat, tsc dă eroare.

// tsconfig.json
{
  "compilerOptions": {
    "module": "commonjs",
    "target": "es2015",
    "importHelpers": true
  }
}

Rezultat (tsc 5.9)

$ npx tsc          # fără tslib în node_modules
index.ts(1,23): error TS2354: This syntax requires an imported helper but module 'tslib' cannot be found.

$ npm install tslib
$ npx tsc && cat index.js
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.citeste = citeste;
const tslib_1 = require("tslib");
function citeste() {
    return tslib_1.__awaiter(this, void 0, void 0, function* () {
        return 42;
    });
}

Exemplul 3: noEmitHelpers fără funcții definite

Cu noEmitHelpers, codul apelează __awaiter, dar nimeni nu l-a definit.

// tsconfig.json
{
  "compilerOptions": {
    "module": "commonjs",
    "target": "es2015",
    "noEmitHelpers": true
  }
}

Rezultat (tsc 5.9)

$ npx tsc && node -e 'require("./index.js").citeste()' 2>&1 | grep -m1 Error
ReferenceError: __awaiter is not defined

Greșeli frecvente

  • Să pui tslib în devDependencies. Codul generat îl cere la rulare, deci trebuie în dependencies.
  • Să folosești noEmitHelpers fără să știi exact ce funcții ajutătoare cere codul.

Comenzi înrudite

  • target: Versiunea de JavaScript generată: sintaxa mai nouă decât ținta este transformată în cod echivalent mai vechi.
  • downlevelIteration: Pentru target es5: transformă for…of, spread și destructurarea folosind iteratorii reali, nu doar indexul.
  • esModuleInterop: Face importul implicit (import x from „pachet”) al modulelor CommonJS să funcționeze corect, la verificare și la rulare.
  • experimentalDecorators: Activează decoratorii vechi (experimentali) ai lui TypeScript, folosiți de Angular și NestJS, în locul celor standard.