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îndevDependencies. Codul generat îl cere la rulare, deci trebuie îndependencies. - Să folosești
noEmitHelpersfă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.