Why TypeScript

Чому TypeScript?

Існує два головних бонуса TypeScript:

  • Надає систему типів optional type system для JavaScript.

  • Надає функціональность, яка буде втілена JavaScript в наступних версіях на основі сучасного JavaScript

Ці бонуси повинні мотивувати вас на навчання.

The TypeScript type system

Система типів в TypeScript

Ви можете бути здивовані "Навіщо додавати типи в JavaScript?"

Використання типізації може суттєво покращити якість вашего коду та зробити його набагато стабільним. Великі команди (Google, Microsoft, Facebook) постійно приходили до цього висновку. Зокрема:

  • Типи підвищують вашу спритність під час виконання рефакторингу. Для компілятора краще виловлювати помилки, ніж мати збій під час виконання.

  • Типізація це одна з найкращих форм створення документації які існують. Сигнатура функції — це теорема, а тіло функції — доказ.

Однак типи мають манеру бути надмірно церемоніальними. TypeScript робить бар’єр входу якомога нижче. Ось як:

Your JavaScript is TypeScript

Ваш JavaScript це TypeScript.

TypeScript забезпечує безпеку типу під час компіляції для вашого коду JavaScript. Це не дивно, враховуючи його назву. Чудово те, що типи абсолютно необов’язкові. Ваш JavaScript код в файлі .js може бути перетворений на файл .ts и TypeScript зможе повернути вам все ще коректний .js еквівалент початкового JavaScript файла. TypeScript це новий поверх над JavaScript з опціональною перевіркою типів.

Types can be Implicit

Типи можуть бути неявними.

TypeScript намагатиметься вивести якомога більше інформації про тип, щоб забезпечити вам безпеку типу з мінімальними витратами продуктивності під час розробки коду. Наприклад, цей приклад TypeScript знає, що "foo" має тип number та поверне помилку:

Така поведінка є досить корисною. Якщо ви робите щось, як показано в цьому прикладі, тоді в решті вашого коду, ви не можете бути впевнені fooє number чи string. Ця проблема більш типова для проекту з великою кількістю файлів. Більш детально ми зануримося в цю тему далі.

Types can be Explicit

Типи можуть бути неявними.

Як ми відмітили раніше, TypeScript намагається зробити код найбільш безпечним. Однак ви можете використовувати анотації, щоб:

  1. Допомогти компілятору та, що важливіше, задокументуйте матеріал для наступного розробника, який має прочитати ваш код (це, можливо, будете і ви в майбутньому!).

  2. Забезпечити те, що компілятор бачить, те, що ви думали, що він повинен бачити. Тобто ваше розуміння коду відповідає алгоритмічному аналізу коду (здійсненому компілятором).

TypeScript використовує анотації типів постфіксів, популярні в інших опціонально анотованих мовах (наприклад, ActionScript і F#).

Якщо ви робите щось не вірно, компілятор видать помилку:

Ми обговоримо всі деталі синтаксісу анатацій, які підтримує TypeScript в наступних главах.

Types are structural

Типи є структурними.

У деяких мовах (зокрема, номінально типізованих) статичне введення призводить до непотрібної церемонії, оскільки навіть якщо ви знаєте, що код працюватиме добре, семантика мови змушує вас копіювати щось навколо. Ось чому такі речі, як automapper для C# є життєво важливими для C#. У TypeScript ми дійсно хочемо, щоб розробникам JavaScript було легко з мінімальним когнітивним перевантаженням, типи є структурними. Це означає, що duck typing (різновид динамічної типізації, застосовуваної в деяких мовах програмування, коли межі використання об'єкта визначаються його поточним набором методів і властивостей, на противагу успадкуванню від певного класу) є першокласною мовною конструкцією. Розглянемо наступний приклад. Функція iTakePoint2D прийме все, що містить усе те, що вона очікує (x і y):

Type errors do not prevent JavaScript emit

Помилки типу не перешкоджають роботі JavaScript.

Щоб вам було легше перенести ваш код JavaScript на TypeScript, навіть якщо є помилки компіляції, за замовчуванням TypeScript видасть дійсний JavaScript в найкращому можливому варіанті.

буде конвертовано в працюючий js:

Тож ви можете поступово оновлювати свій код JavaScript до TypeScript. Це дуже відрізняється від роботи багатьох компіляторів інших мов і є ще однією причиною переходу на TypeScript.

Types can be ambient

Основною метою розробки TypeScript було зробити можливим безпечне та просте використання існуючих бібліотек JavaScript у TypeScript. TypeScript робить це за допомогою declaration. TypeScript надає вам гнучку шкалу того, скільки зусиль ви хочете докласти до ваших декларацій, що більше зусиль ви докладете, то більше безпеки типів + коду ви отримаєте. Зауважте, що спільнота DefinitelyTyped уже написала визначення для більшості популярних бібліотек JavaScript, які покривають більшості цілей:

  1. Файл визначення вже існує.

  2. Або, принаймні, у вас є широкий список добре перевірених шаблонів декларацій TypeScript, які вже доступні

Як короткий приклад того, як ви створили б власний файл декларації, розглянемо тривіальний приклад jquery. За замовчуванням (як і слід очікувати від хорошого коду JS) TypeScript очікує, що ви оголосите (тобто використаєте десь var) перед використанням змінної

Як швидкий фікс ви можете сказати TypeScript що це є дещо з назвою $:

Якщо ви хочете, ви можете спиратися на це базове визначення та надати більше інформації, яка допоможе захистити вас від помилок:

Ми детально обговоримо деталі створення визначень TypeScript для існуючого JavaScript пізніше, коли ви дізнаєтесь більше про TypeScript (наприклад, такі речі, як interface і any).

Future JavaScript => Now

Майбутній JavaScript => Зараз.

TypeScript надає низку функцій, запланованих у ES6 для поточних механізмів JavaScript (які підтримують лише ES5 тощо). Команда TypeScript активно додає ці функції, і цей список з часом лише розширюватиметься, і ми розглянемо це у окремому розділі. Але як зразок ось приклад класу:

та він підтримує виконистання функції-стрілки:

Summary

У цьому розділі ми надали вам мотивацію та цілі розробки TypeScript. Подолавши це, ми можемо копатися в дрібницях TypeScript. [](Interfaces are open ended) [](Type Inference rules) [](Cover all the annotations) [](Cover all ambients : also that there are no runtime enforcement) [](.ts vs. .d.ts)

Last updated