Параметри компіляції noEmitOnError і target

У минулій темі було розглянуто, що не можна в одній області видимості кілька разів визначити змінну з одним і тим самим ім'ям або що значення константи не можна змінити.

Але давайте розглянемо наступну невелику програму на TypeScript:

let x = 10;
console.log(x); // 10
 
var x = 20; // ! Помилка
console.log(x); // Але консоль виведе 20
 
const t = 50;
t = 256; // ! Помилка
console.log(t); // Але консоль виведе 256

Під час компіляції очікувано ми побачимо низку помилок:

Помилки компіляції в TypeScript

Проте, якщо застосовуються налаштування компіляції за замовчуванням, javascript-файл цілком нормально скомпілюється, зокрема, він матиме такий зміст:

var x = 10;
console.log(x); // 10
var x = 20; // ! Помилка
console.log(x); // Але консоль виведе 20
var t = 50;
t = 256; // ! Помилка
console.log(t); // Але консоль виведе 256

І в підсумку в консолі браузера ми побачимо результат роботи цього скрипта:

Але для компілятора TS можна за допомогою параметра --noEmitOnError можна вказати, що не треба генерувати файл javascript, якщо під час компіляції виникли помилки. Цей параметр можна вказати безпосередньо під час виклику компілятора в консолі:

tsc --noEmitOnError app.ts
Або у файлі конфігурації tsconfig.json для налаштування "noEmitOnError" вказати значення true:

{
    "compilerOptions": {
        "target": "es5",
        "noEmitOnError": true,
        "outFile": "app.js"
    }
}

target

Виправимо попередній приклад, щоб він проходив компіляцію

let x = 10;
console.log(x); // 10
 
var y = 20;
console.log(y); // 20
 
const t = 50;
console.log(t); // 50

Під час компіляції з налаштуваннями за замовчуванням ми отримаємо такий файл javascript:

var x = 10;
console.log(x); // 10
var y = 20;
console.log(y); // 20
var t = 50;
console.log(t); // 50

Ми бачимо, що для визначення всіх значень застосовується ключове слово var, незважаючи на те, що навіть не найсучасніші браузери вже давно підтримують оператори let і const. Але компілятор typescript за замовчуванням компілює в стандарт ES3, для якого існує тільки оператор var. Але var/let/const - це окремі випадки. Як мінімум, переважна частина стандарту ES2015 вже давно підтримується в багатьох поширених браузерах, свій шлях прорубують нові стандарти. І якщо ми хочемо, щоб компілятор використовував сучасніший стандарт, то нам треба задати під час компіляції параметр -target/-t.

Наприклад, знову візьмемо файл, який містить помилки:

let x = 10;
console.log(x); // 10
 
var x = 120; // ! Помилка
console.log(x); // Але консоль виведе 20
 
const t = 50;
t = 256; // ! Помилка
console.log(t); // Але консоль виведе 256

Скомпілюємо в стандарт "ES2015":

tsc app.ts -t ES2015

Тут не вказано параметр "noEmitOnError", тож компілятор повідомить про помилки, однак файл все одно скомпілює. Скомпільований файл практично не відрізнятиметься від коду на typescript:

let x = 10;
console.log(x); // 10
var x = 120; // ! Помилка
console.log(x); // Але консоль виведе 20
const t = 50;
t = 256; // ! Помилка
console.log(t); // Але консоль виведе 256

Однак у браузері, який підтримує let і const, все одно ми зіткнемося з помилкою:

Також можна задати це налаштування у файлі tsconfig.json:

{
    "compilerOptions": {
        "target": "es2015",
        "noEmitOnError": true,
        "outFile": "app.js"
    }
}