У минулій темі було розглянуто, що не можна в одній області видимості кілька разів визначити змінну з одним і тим самим ім'ям або що значення константи не можна змінити.
Але давайте розглянемо наступну невелику програму на 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":
Тут не вказано параметр "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"
}
}